mirror of https://github.com/portainer/portainer
develop
release/2.24.0
release/2.24
release/2.23
release/2.22
release/2.21
release/2.21.4
placeholder
sync-test
fix/r8s-120/app-table-settings-persistence
fix/r8s-109/alow-standard-user-to-edit-volumes
fix/r8s-103/more-resources-system-filtering
fix/BE-11102/force-redeploy-edge-stack
sync-test-222
sync-test-221
test-update
vault/release-2.21
vault/develop
refactor/EE-7128/webeditor-doc-type
test-version-semver
feat/be-11276/be-ce-agent-change
feat/be-11276/be-ce-agent-change-lts
feat/be-11275/be-ce-change
feat/be-11275/change-be-ce-lts
vault/release-2.22
fix/r8s-99/create-application-ns-dropdown
rc/2.22.0-rc1
chore/BE-11236/change-linode-branding-to-akamai-connected-cloud
rc/2.21.0-rc2
refactor/k8s-namespaces
rc/2.21.0-rc1
yd-test
fix/EE-7284/show-services-explaination
refactor/EE-2229/docker-images-list-view
refactor/EE-2208/docker-configs-list-view
refactor/EE-2300/env-item-view-react
develop-james-nfs
refactor/EE-6923/settings-api
fix/EE-7150/tls-cipher-suites-2.20
release/2.20
fix/7011/refactor3
fix/EE-6631/wait-in-defer-close-websocket
fix/EE-7049/update-reachable-check-release
fix/EE-6705/namespace-yaml-no-rq
release/2.19
refactor/data-cy
fix/EE-6855/removed-user-cause-auto-update-fail
fix/release/EE-6855/removed-user-cause-auto-update-failure
fix/release/EE-6855/removed-user-cause-auto-update-fail
dependabot/npm_and_yarn/undici-6.11.1
dependabot/npm_and_yarn/vite-5.2.8
fix/release/EE-6808/add-api-endpoint-access-check-1
dependabot/npm_and_yarn/express-4.19.2
dependabot/npm_and_yarn/webpack-dev-middleware-5.3.4
dependabot/go_modules/github.com/docker/docker-24.0.9incompatible
chore/XT-1188/add-data-cy-for-backup-and-restore
dependabot/npm_and_yarn/follow-redirects-1.15.6
fix/EE-6843/tunnel-timeout
dependabot/go_modules/google.golang.org/protobuf-1.33.0
fix/EE-6818/api-error-message-rel
fix/EE-6818/api-error-message
dependabot/npm_and_yarn/sanitize-html-2.12.1
fix/EE-6744/compose-runc-develop
dependabot/npm_and_yarn/ip-2.0.1
fix/EE-5936/EE-6736/reject-to-assign-edge-admin
fix/release/EE-5936/EE-6736/reject-to-assign-edge-admin
fix/release/EE-6627/lint-failure
fix/EE-6627/lint-failure
fix/EE-6723/use-pure-admin-release
fix/EE-6723/use-pure-admin
fix/EE-6647/tables-correct-external-display-for-resource-release
fix/EE-6647/tables-correct-external-display-for-resource
fix/EE-6596/edge-stack-create-template
dependabot/npm_and_yarn/browserslist-4.22.2
feat/EE-6454/support-docker-compose-run
dependabot/npm_and_yarn/semver-5.7.2
refactor/EE-6549/EE-6444/git-redeploy-form-section
fix/EE-6411/env-vars-cursor-shift
fix/EE-6459/CVEs
fix/EE-661/staticcheck
fix/EE-6435/close-before-restore-release
revert-10718-fix/EE-6392/show-edit-external-app
fix/EE-6346/gitops-commit-links-2-release
fix/EE-5664/oauth-show-asterisks-placeholder-release
fix/release/EE-6373/target-path-exist-error-when-upgrade
fix/EE-6373/target-path-exist-error-when-upgrade
fix/EE-661/enable-ineffassign
fix/EE-6377/singleflight-gitops-rel
fix/EE-6114/gitops-data-race-rel
fix/EE-6114/gitops-data-race-dev
fix/EE-6373/upgrade-target-path-exists
fix/EE-6321/gitops-online-check-rel
fix/EE-6211/stack-build-context-validation-rel
fix/EE-6211/stack-build-context-validation-dev
release/2.19.2
feat/EE-5573/related-changes
refactor/with-form-validation-set-field-value
refactor/EE-5521/migrate-app-create-form-to-react
refactor/EE-2307/EE-5207/container-base-form
fix/EE-4602/switch-color-fix-rel
fix/EE-4602/switch-color-fix-rel-new
feat/EE-4337/EE-4484/CE/docker-networks-datatable
refactor/EE-4337/service-task-datatable
fix/EE-5980/version-stack-backward-capability
snyk-fix-0fc01e6b5b4266e90ae8d7d367ac399f
feat/EE-4500/gorm-sqlite-poc
release/2.18
fix/EE-5695/env-manage-access
fix/EE-5497/helm-repo-url-update
fix/EE-5406/remove-path-ingress-host-rel
fix/EE-3841/fix-associated-environments
refactor/EE-2270/EE-5502/settings-components
feat/EE-4986/enable-lb-np-type-ingresses
fix/EE-1976/support-copy-paste-in-container-console
fix/revert-makefile-218
fix/dev-build-scripts
fix/EE-5311/endpoint-api-swagger-doc
fix/EE-3059/security-scan-debug
feat/EE-5028/security_teaser
fix/EE-5234/non-existent-pvc-rel
fix/EE-5234/non-existent-pvc
fix/EE-5149/namespace-cache-refresh-rel
fix/EE-4498/fix-swagger-id-types
dependabot/npm_and_yarn/minimist-1.2.8
fix/EE-4839/normalize-project-name
dependabot/go_modules/api/golang.org/x/net-0.7.0
release/2.17
feat/EE-4754/omit-empty
chore/update-tool-versions
fix/EE-4991/kube-storage-detection
chore/EE-4951/update-edgestack-test
chore/remove-old-pkg-path
dependabot/npm_and_yarn/fast-json-patch-3.1.1
feat/EE-4752/go-json
fix/release/EE-4781/no-error-message-if-ce-upgrade-fails
dependabot/npm_and_yarn/json5-1.0.2
fix/EE-4766/fix-data-race-in-edgeJobTasksCollect
fix/EE-4781/no-error-message-if-ce-upgrade-fails
feat/EE-3604/ui-edge-devices
dependabot/npm_and_yarn/decode-uri-component-0.2.2
feat/EE-3417/EE-3418/multiple-git-repository
release/2.16
dependabot/npm_and_yarn/loader-utils-1.4.2
dependabot/npm_and_yarn/deep-object-diff-1.1.9
fix/EE-4548/vulnerable-to-path-traversal-attacks
fix/EE-3155/cannot-save-internal-authentication
fix/EE-4286/update-tls-cert-for-docker-env
feat/fedex/sqlite
feat/fedex/sqlite-settings
revert-7749-bug/EE-4311/ingressclass-disallowed-rel
fix/EE-4322/namespace-disallow
fix/EE-4312/js-paths
release/2.15
fix/EE-3641/page-title-fix
fix/root-provider
feat-fdo-1.1
feat/EE-3894/ui-waiting-room-icon
snyk-fix-afd68b0b2e0ac933fa52b1544ba67c24
feat/EE-3513/ui-docker-volume-browser-2
feat/EE-3388/EE-3478/ui-improvements-namespace-access
feat/EE-3505/ui-docker-images-item-test
fix/EE-3683/stack-permissions-are-ignored
feat/EE-3576/portainer-wizard-ui-change
feat/EE-3375/ce/wizard-add-identifiers-for-TA
feat/EE-3491/new-docker-create-ui
release/2.14
feat/DTD-102/new-logger
feat/EE-3533/ui-edge-stacks-create
dependabot/npm_and_yarn/terser-4.8.1
fix/EE-2907/ce/missing-kubernetes-sidebar-entries
fix/EE-3686/fix-tooltip-double-issue
fix/ee-3506/update-image-list-ui
fix/EE-3521/swarm-service-list-ui
feature/EE-3636/icon-styling
fix/EE-3512/swarm-secrets-list-ui
fix/EE-3488/swarm-config-list-ui
fix/ee-3509/update-network-list-ui
fix/ee-3516/update-vol-list-ui
feat/EE-2552/EE-3451/-be-supply-build-info
oscarzhou-portainer-patch-1
feat/EE-3079/edge-stack-logs
fix/EE-3445/open-tooltip-on-hover
fix/EE-3324/password-change-error
feat/EE-3252/remove-unused-port-on-extension
feat/3143-nvidia-container-toolkit
edge-wss
dependabot/npm_and_yarn/grunt-1.5.3
podman-2022
release/2.13
debug-api-endpoint
fix/EE-3152/tls-downgrade-release
feat/EE-3152/tls-downgrade
feat/EE-3062/EE-3085/document-extension
feat/ce-220-security-scan
fix/EE-2835/add-edge-groups-column-in-edge-device-view
feat/EE-2680/allow-env-vars-passed-on-webhooks
fix/EE-2966/migration-test-dev
dependabot/npm_and_yarn/async-2.6.4
feat/EE-2747/docker-desktop-extension-auto-generation
dependabot/npm_and_yarn/node-forge-1.3.1
snyk-fix-bcb96aa2f9b730b2f44c3825ceba182a
fix/EE-2594/empty-network-option-in-windows
EE-2691-experiment
snyk-fix-af06d21279ebae87a2d003141849185d
fix/broken-go-lint-settings
release/1.25
snyk-fix-411816fd9cf6e70ce95f0fc76a2e8f42
feat/EE-810/EE-2691/disable-instance-if-not-initialized
fix/EE-2167/Migrate-124-users-to-213
refactor/EE-2545/migration-improvements
feat/EE-2597/create-object-with-string-id
feat/EE-2404/async-edge-command-queue
1.24
feat/support-agent-auto-upgrade
chore/reduce-dependency-obfuscation
fix/EE-2167/Migrate-1x-users-to-2x
feat/EE-2493/poc-mtls-for-edge-agent
spike/DTD-58/DTD-72/useractivity-middleware
fix/EE-2432/edge-stacks-status-update
master
release/2.11
feat/dev-metrics
fix/EE-2489/release/amt-devices-table-hide-expand
2.11.1-fdo
fix/release/remove-double-import
feat/EE-1905/environment-type-filter
db-fixture-support
feat/edge-devices-view-react
dependabot/npm_and_yarn/y18n-4.0.3
feat/INT-32/intel-images-openamt
dependabot/npm_and_yarn/dns-packet-1.3.4
dependabot/npm_and_yarn/hosted-git-info-2.8.9
dependabot/npm_and_yarn/ssri-6.0.2
feat/EE-1852/EE-1983/encryption-key-with-store-refactor
feat/ee-1977/rollup-duplicated-volumes
feat/EE-1852/EE-1983/encryption-key
feat/EE-506/release-2.11-support-base-url
revert-6182-revert-6172-fix/INT-6/open-amt-config
fix/ee-2060/support-upload-huge-file
feat/INT-16/poc-amt-api-rpc-handler
fix/EE-1939/provide-right-order-to-registries-in-dropdown-menu
fix/EE-1973/container-logs-download-extra-CR
feat/INT-15/proxy-mps
release/2.9
fix/swagger/restore-params
fork_branch
feat/EE-1942/resource-setting-update
toolkit-v2
fix/EE-1922/harden-filesystem-service
fix/EE-1971/bubble-panic-error
fix/EE-1971/bubble-panic-error-release
chore/upgrade-to-bbolt
poc-searchbar
fix/EE-1867/standard-user-unable-to-access-pod-and-node-stats
fix/EE-1911/can-not-update-application-publishing-mode-develop
fix/EE-1911/can-not-update-application-publishing-mode
feat/EE-1611/EE-1878/pull-and-redeploy-button-visibility
fix/EE-1872/namespaces-stack-deletion-develop
fix/EE-1872/namespaces-stack-deletion
feat/EE-568/admin-auto-population-ldap-ce
fix/release-conflicts
feat/EE-568/admin-auto-population-ldap
snyk-fix-234920d529b1716a428f2b20a3048d37
fix/EE-1845/ldap-user-enable-release
fix/EE-1845/ldap-user-enable
fix/EE-882/EE-1793/box-selector-icon-position
fix/EE-1316/jwt-is-exposed-in-the-activity-log
feat/EE-1543/Allow-Services-to-be-managed-for-external-kube-apps
feat/EE-189/EE-577/support-git-automated-sync-for-k8s-applications
feat/EE-577/EE-1760/remove-stack-when-no-app
XT-807-ui-automation-kube-smoke-tests-helm
feat/EE-1627/introduce-the-ability-to-filter-applications-by-type
bug/EE-1734/Registry-page-displays-No-registry-available-despite-being-dockerhub-registry-available
feat/EE-882/EE-1672/registry-view
feat/EE882/EE-1675/logs
fix/EE-1439/modify-new-data-store-check-logic
docs/add-tool-versions
fix/EE-1696/polling-webhook-of-stack-from
fix-release-production
fix/EE-1714/add-debug-log-for-volume-migration-develop
fix/EE-1714/add-debug-log-for-volume-migration
fix/EE-1707/cannot-deploy-git-stack-without-username-de
fix/EE-1707/cannot-deploy-git-stack-without-username
fix/EE-1678/failed-to-create-namespace-when-having-registry-de
feat/EE-1635/remove-stack-from-app-list
fix/EE-1710/Error-message-in-stats-view-non-admin-missing-description
fix/EE-1710/error-message-in-stats-view-non-admin-missing-description
fix/EE-1709/Fix-git-stack-authentication-on-by-default
fix/EE-1709/fix-git-stack-authentication-on-by-default
fix/EE-1712/no-icon-displayed-when-template-created-via-upload-file
fix/EE-1712/No-icon-displayed-when-template-created-via-upload-file
fix/EE-1678/failed-to-create-namespace-when-having-registry
fix/EE-1661/fully-rename-endpoint-to-environment-in-swagger-doc
fix/EE-1660/fix-custom-logo-not-updated
fix/EE-1636/fix-question-mark-alignment-in-PAT-field
test/node_env
fix/EE-1653/wrong_table_background_color_for_helm_application_listing
feat/ee-834/fix-openapi-errors
fix/EE-1073/fix_difficulties_selecting_mixed_protocols_for_k8s
feat/EE-1635/removed-stack-deletion-in-app-list-page
feat/EE-1089/First-UX-experience
fix/EE-1586/file-not-persisted-after-deployed-with-url
feat/EE-577/EE-1594/use-user-token-for-autoupdate
chore/EE-1052/Replace-all-the-references-to-deviantony
fix/EE-1591/non-admin-users-cannot-deploy-charts-containing-secrets
feat/EE-909/Dark_high_contrast_mode_supported
feat/EE-1206/Rename_endpoints_to_environments
snyk-fix-ed0fa419898eea7805b20ec7511ebde2
fix/EE-1553/unable-to-apply-note-to-k8s-application
feat/EE-809/EE-466/kube-advanced-apps
feat/EE-1278/swagger-doc-fixes
fix/EE-1454/tag-not-attached-to-local-k8s-endpoint
fix/EE-1564/CE-missing-header-namespace-create-view
feat/EE-1096/CE-registry-delete-warning-modal
default-namespace-selector-behavior
snyk-fix-f52082e2df9f9108004d0a670eeb3f6a
snyk-fix-491ba6a89fe0b2b0e65e3b4c0ef0fd14
fix/EE-1505/CE-update-default-namespace
fix/EE-1424/CE-equal-in-env-vars
fix/EE-1291/EE-1292/git-stack-form-validation-improvements
fix/release-commits-cherrypick
fix/EE-1540/fix_changing_helm_repo_not_refresh_issue
fix/EE-1540/changing_the_default_helm_repo_still_shows_old_charts
fix/EE-1511/robust-kubernetes-API-proxy
poc-kube-deploy-from-url
toolkit-update
release/2.6
chore/EE-1509/replace-stalebot-with-action
feat/EE-466/EE-1199/front-end-CE-backport
release/2.6.3/EE-1143/update-networking-v1beta1-to-v1
feat/EE-1502/auth-detail-not-remembered
feat/EE-466/EE-1189/backport-to-ce
feat/EE-248/EE-1425/enable-save-button-when-password-exists
fix/EE-1402/increment-api-version
feat/EE-1178/CE-clarify-metrics-switch
demo-v2
feat/EE-248/EE-1323/dont-return-password-back
feat/EE-248/EE-1310/substituting-from-env-file-in
feat/update-github-banner
feat/update-readme-from-marketing
snyk-fix-6a198797807c43d474095224f758f0b8
refactor/EE-1053/CE-rename-storage-section
feat/EE-951/CE-registries-accesses-relocation-indicator
feat/EE-883/CE-getting-started-page
snyk-fix-8976c3e2173dcb1c31a7b3f2e97ebc23
fix/EE-1152/importing-images
feat/EE-1148/modify-ldap-get-groups-func
feat/EE-986/add-admin-mapping-section-inLDAP
feat/EE-1021/fe-backport-automated-sync-for-stacks
528
feat/ee-370/ee-515/ce-update-to-1-16
fix/EE-1072/ingresses-hostname-fields-fix
feat/EE-992/update-ldap-settings
feat/EE-930/admin-auto-population-oauth
feat/EE-971/admin-mapping-section-oauth
snyk-fix-f7a7da24eb70f58d73a6949d4765aa68
feat/EE-975/mapping-oauth-group-to-admin-role
refactor4071-constants-step2
feat/EE-971/admin-mapping-section
feat/EE-161/redeploy-stack-from-git
feat/EE-781/change-edit-stack-view
feat/EE-829/implement-edit-git-deploy-stack-endpoint
feat/EE-780/change-add-stack-view
snyk-fix-e6fed59bc40accf75940b773b4175580
snyk-fix-536f1662b19d0dec5659b4501ba650d2
feat/EE-447/k8s-advanced-deployment-from-git-repo
snyk-fix-6f2c5f2ac6b982591828a069f9645d54
Testing-merge-of-161-446-447
fix/EE-948/swagger-param-name-fix-for-endpoint-create
release/2.5
feat/EE-786/create-stack-updates-for-git-sync
feat/GH/827-service-healthchecks
epic/CE-309/backup-private-registries-20210531
fix/EE-812/can-not-deploy-stack-app-templates
snyk-fix-19f7491fbb67710fad7da7da2d291d88
epic/CE-309/feat/CE-512/backport-ee-30-backend
feat/EE-608/update-store-and-retrieve-settings-handler
epic/CE-309/feat/CE-513/backport-ee-30-frontend
feat/EE-643/logout-logic-changes
feat/EE-672/CE-reorder-placement-policies-options
feat/EE-607/settings-view
fix/CE-575/type-downgrade-error
fix/EE-645/ACI-UAC-breaks-when-redeploying-container-with-same-name-as-one-already-existing
revert-5021-feat/EE-596/update-agent-version-in-deployment-instructions
feat/CE-223/migrate-selector
snyk-fix-520e95e409cb8ddd217a7f0aa2160ce9
feat/EE-596/update-agent-version-in-deployment-instructions
snyk-fix-6fd487252f28262d8a4f0f6a99808327
snyk-fix-5aff38ac9bd148fe8a3b5d45adb2dcc8
snyk-fix-bdfbcf8def6d0925eb3a3090aa4fec17
snyk-fix-c741bd40fab715925bb9221fefb7f1d9
revert-4952-feat/CE-414/add-UAC-to-ACI
refactor/EE-31/use-docker-compose-wrapper
snyk-fix-89cdb3c26b67f4a51e27f70eeefcb3c4
feat(backup)-backup-restore-system
feat(backup)-add-s3-stubs-to-ce
snyk-fix-a8022c23ed6afd9c00eb9dd4441da8ef
snyk-fix-b72acb2aca16fd54a76ac2eda18230d2
fix/EE-458/pull-latest-image-toggle-missing
snyk-fix-dbde1a343d9bd699ea8bb876f27953de
snyk-fix-9de633ccccac0fa6c366b8c9747b637e
snyk-fix-d3a07bfe2eea4450b0c42fa6adb9007c
Chore--Add-Licenses-attributions
feat-1.24.2
feat/CE/487-registry-access-control-merge
epic/CE-309/private-registries-backup
feat/CE/487-registry-access-control
fix/CE-478/Unable-to-save-cluster-configuration-with-fresh-deployment
feat/CE-493/update-docker-swarm-kubernetes-sidebars
feat/CE-490/kubernetes-registries-support
feat/CE-485/remove-registry-usage-information-panel
feat/CE-486/introduce-dockerhub-authenticated
feat/GH/4419-kubernetes-create-volume
feat/GH/4240-show-error-reason-when-custom-template-creation-fails
fix/CE-471/config-vars-showing-on-environment-variables-section-on-application-edit-screen
fix/CE/466-app-templates-not-loading-error
fix/CE/466-app-templates-not-loading
fix/CE-463/cluster-configuration-fresh-deployment
fix/CE/4843-update-application-persisted-data
fix/ce-51-labels
feat(dev)--CE-420-Add-automatic-rebase-to-github
2.1.1
feat/GH/3143-nvidia-container-toolkit
feat/GH/4743-not-filter-custom-templates
release/2.1
fix/private-registries
fix/ce-401-private-registry
feat/GH/4779-kubernetes-edit-yaml
fix-ce395-parse-empty-configuration-as-empty-string-yaml
fix-ce#394-trigger-port-validation-while-changing-protocol
fix-ce394-trigger-port-validation-while-changing-protocol
fix/missing-kubectl-download
sec/utils-extend
fix/compose-Bump-docker-compose-to-1.28.2
feat/cd-187-docker-compose-wrapper
feat-4728-better-form-validation-for-configuration-keys
feat/cd-187-add-auth-proxy-to-docker-compose
chore-4473-bump-kompose-version
fix-4503-cannot-access-configuration-details-view-containing-binary-data
release/2.0.1
feat/GH/4419-create-volume
fix/201-api-version
revert-4475-chore-ce-86-bump-kompose-version
CE-185-build-static-docker-compose-linux-binary
revert-4418-feat/gh/3889-stacks-create-update-dates
fix-4595-transform-username-to-be-dns-compliant
feat/GH/4011-pods-as-applications
fix-4553-revalidate-configuration-name-when-change-resource-pool
fix-4547-override-confgiuration-keys-disappear
feat4545-matomo
fix4463-resourcecontrol-deletion
feat95-applications-configurations-modals
fix/GH/4502-update-sensitive-configuration
feat/GH/4404-start-without-endpoint
fix/GH/4488-refreshing-yaml-panel-change-panel
fix/GH/4492-cluster-setup-incorrectly-expand-endpoint-sidebar
fix/GH/4490-invalid-display-load-balancer-panel
chore56-add-JS-source-map
Disable-Container-Capabilities-for-non-admins
fix/gh/4390-sort-labels
fix-k8s-daemonset-noschedule
fix-k8s-volume-filter
fix-k8s-system-volumes-filter
feat4204-banner
revert-4197-fix-login-after-restart
telemetry-matomo
mockup4003-placement
demo
feat-db-migration-1.24.1
revert-3966-feat454-endpoint-url
fix3604-remove-runtime-persistence
fix3936-add-database-migration
feat-rbac-tests
poc-orphaned-stack
2.0
feat3742-telemetry
feat3744-aci
feat3580-username-lowercase
fix3272-bad-volume-ownership
fix-windows-multiarch-build
feat-1807-service-network-management
fix3429-networks-object-undefined
hotfix-1.22.2
feat2901-introduce-backup
feat2928-dockerhub-registry
feat1752-introduce-deploymentkeys
feat-upload-files-container
storidge-standalone
dbg11042019
refactor-es9-migration
fix2626-endpoint-management-cmd-line
feat2456-ux-high-latency
feat1752-stack-deploy-keys
adsense
feat807-i18n
gh-pages
2.24.0
2.21.4
2.23.0
2.21.3
2.22.0
2.22.0-rc1
2.21.2
2.21.1
2.21.0
2.21.0-rc2
2.21.0-rc1
2.19.3
2.19.2
2.19.1
2.19.0
2.18.4
2.18.3
2.18.2
2.18.1
2.17.1
2.17.0
2.16.2
2.16.1
2.16.0
2.15.1
2.15.0
2.14.2
2.14.1
2.14.0
2.13.1
2.13.0
2.11.1
1.24.1
1.24.0
1.23.2
1.23.1
1.23.0
1.22.2
1.22.1
1.22.0
edge_m2
1.21.0
1.20.2
1.20.1
1.20.0
1.19.2
1.19.1
1.19.0
1.18.1
1.18.0
1.17.1
1.17.0
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.15.5
1.15.4
1.15.3
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.6
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.12.4
1.12.3
1.12.2
1.12.1
1.12.0
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.2
1.10.1
1.10.0
1.9.3
1.9.2
1.9.1
1.9.0
internal-1.8.1
1.8.1
internal-1.8.0
1.8.0
internal-1.7.0
1.7.0
internal-1.6.0
1.6.0
internal-1.5.0
1.5.0
internal-1.4.0
1.4.0
internal-1.3.0
1.3.0
internal-1.2.0
1.2.0
1.1.0
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
v0.10.1
v0.10.0
v0.9.0
v0.8.0
v0.5
1.24.2
1.25.0
2.0.0
2.0.1
2.1.0
2.1.1
2.11.0
2.19.4
2.19.5
2.20.0
2.20.1
2.20.2
2.20.3
2.5.0
2.5.1
2.6.0
2.6.1
2.6.2
2.6.3
2.9.0
2.9.1
2.9.2
2.9.3
v0.6.0
v0.7.0
v0.8.1
${ noResults }
11 Commits (a09fe7e10c4c6a2b21bed2d8fb31315e7b5651f9)
Author | SHA1 | Message | Date |
---|---|---|---|
matias-portainer |
e1b474d04f
|
feat(edgejobs): support edge groups when using edge jobs EE-3873 (#8099)
|
2 years ago |
andres-portainer |
cb79dc18f8
|
chore(code): reduce divergence with EE EE-4344 (#7748)
|
2 years ago |
andres-portainer |
9ef5636718
|
chore(handlers): replace structs by functions for HTTP errors EE-4227 (#7664)
|
2 years ago |
Sven Dowideit |
f99329eb7e
|
chore(store) EE-1981: Refactor/store/error checking, and other refactoring (#6173)
* use the Store interface IsErrObjectNotFound() to avoid revealing internal errors Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * what happens when you extract the datastore interfaces into their own package Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * Start renaming Storage methods Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * extract the boltdb specific code from the Portainer storage code (example, the others need the same) Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * more extract bolt.Tx from datastore code Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * minimise imports by putting moving the struct definition into the file that needs the Service imports Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * more extraction of boltdb.Tx Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * extract the use of bucket.SetSequence Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * almost done - just endpoint.Synchonise :/ Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * so, endpoint.Synchonize looks hard, but i can't find where we use it, so 'delete first refactoring' Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix test compile errors Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * test compile fixes after rebase Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix a mis-remembering I had wrt deserialisation - last time i used AnyData - jsoniter's bindTo looks interesting for the same reason Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * set us up to make the connection an interface Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * make the db connection a datastore interface, and separate out our datastore services from the bolt ones Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * rename methods to something less oltdb internals specific Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * these errors are not boltdb secific Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * start using the db-backend factory method too Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * export boltdb raw in case we can't export from the service layer Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add a raw export from boltdb to yaml for broken db's, and an export services to yaml in backup Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add the version info by hand for now Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * actually, the export from services can be fully typed - its the import that needs to do more work Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * redo raw export, and make import capable of using it Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add DockerHub Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * migration from anything older than v1.21.0 has been broken for quite a while, deleting the un-tested code Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix go test ./... again Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * my goland wasn't setup to gofmt Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * move the two extremely dubious migration tests down into store, so they can use the test store code Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * the migrator is now free of boltdb Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * reverse goland overzealous replcement of internal with boltdb Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * more undo over-zealous goland internal->boltdb Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * yay, now bolt is only mentioned inside the api/database/ dir Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * and this might be the last of the boltdb references? Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add todo Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * extract the store code into a separate module too Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * don't need the fileService in boltdb anymore Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * use IsErrObjectNotFound() Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * use a string to select what database backend we use Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * make isNew store an ephemeral bool that doesn't stay true after we've initialised it Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * move the import.json wip to a separate file so its more obvious - we'll be using it for testing, emergency fixups, and in the next part of the store work, when we improve migrations and data model lifecycles Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * undo vscode formatting html Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix app templates symbol (#6221) * feat(webhook) EE-2125 send registry auth haeder when update swarms service via webhook (#6220) * feat(webhook) EE-2125 add some helpers to registry utils * feat(webhook) EE-2125 persist registryID when creating a webhook * feat(webhook) EE-2125 send registry auth header when executing a webhook * feat(webhook) EE-2125 send registryID to backend when creating a service with webhook * feat(webhook) EE-2125 use the initial registry ID to create webhook on editing service screen * feat(webhook) EE-2125 update webhook when update registry * feat(webhook) EE-2125 add endpoint of update webhook * feat(webhook) EE-2125 code cleanup * feat(webhook) EE-2125 fix a typo * feat(webhook) EE-2125 fix circle import issue with unit test Co-authored-by: Simon Meng <simon.meng@portainer.io> * fix(kubeconfig): show kubeconfig download button for non admin users [EE-2123] (#6204) Co-authored-by: Simon Meng <simon.meng@portainer.io> * fix data-cy for k8s cluster menu (#6226) LGTM * feat(stack): make stack created from app template editable EE-1941 (#6104) feat(stack): make stack from app template editable * fix(container):disable Duplicate/Edit button when the container is portainer (#6223) * fix/ee-1909/show-pull-image-error (#6195) Co-authored-by: sunportainer <ericsun@SG1.local> * feat(cy): add data-cy to helm install button (#6241) * feat(cy): add data-cy to add registry button (#6242) * refactor(app): convert root folder files to es6 (#4159) * refactor(app): duplicate constants as es6 exports (#4158) * fix(docker): provide workaround to save network name variable (#6080) * fix/EE-1862/unable-to-stop-or-remove-stack workaround for var without default value in yaml file * fix/EE-1862/unable-to-stop-or-remove-stack check yaml file * fixed func and var names * wrapper error and used bool for stringset * UT case for createNetworkEnvFile * UT case for %s=%s * powerful StringSet * wrapper error for extract network name * wrapper all the return err * store more env * put to env file * make default value None * feat: gzip static resources (#6258) * fix(ssl)//handle --sslcert and --sslkey ee-2106 (#6203) * fix/ee-2106/handle-sslcert-sslkey Co-authored-by: sunportainer <ericsun@SG1.local> * fix(server):support disable https only ee-2068 (#6232) * fix/ee-2068/disable-forcely-https * feat(store): implement store tests EE-2112 (#6224) * add store tests * add some more tests * Update missing helm user repo methods * remove redundant comments * add webhook export * update webhooks * use the Store interface IsErrObjectNotFound() to avoid revealing internal errors Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * what happens when you extract the datastore interfaces into their own package Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * Start renaming Storage methods Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * extract the boltdb specific code from the Portainer storage code (example, the others need the same) Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * more extract bolt.Tx from datastore code Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * minimise imports by putting moving the struct definition into the file that needs the Service imports Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * more extraction of boltdb.Tx Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * extract the use of bucket.SetSequence Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * almost done - just endpoint.Synchonise :/ Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * so, endpoint.Synchonize looks hard, but i can't find where we use it, so 'delete first refactoring' Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix test compile errors Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * test compile fixes after rebase Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix a mis-remembering I had wrt deserialisation - last time i used AnyData - jsoniter's bindTo looks interesting for the same reason Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * set us up to make the connection an interface Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * make the db connection a datastore interface, and separate out our datastore services from the bolt ones Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * rename methods to something less oltdb internals specific Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * these errors are not boltdb secific Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * start using the db-backend factory method too Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * export boltdb raw in case we can't export from the service layer Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add a raw export from boltdb to yaml for broken db's, and an export services to yaml in backup Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add the version info by hand for now Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * actually, the export from services can be fully typed - its the import that needs to do more work Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * redo raw export, and make import capable of using it Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add DockerHub Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * migration from anything older than v1.21.0 has been broken for quite a while, deleting the un-tested code Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * fix go test ./... again Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * my goland wasn't setup to gofmt Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * move the two extremely dubious migration tests down into store, so they can use the test store code Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * the migrator is now free of boltdb Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * reverse goland overzealous replcement of internal with boltdb Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * more undo over-zealous goland internal->boltdb Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * yay, now bolt is only mentioned inside the api/database/ dir Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * and this might be the last of the boltdb references? Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * add todo Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * extract the store code into a separate module too Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * don't need the fileService in boltdb anymore Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * use IsErrObjectNotFound() Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * use a string to select what database backend we use Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * make isNew store an ephemeral bool that doesn't stay true after we've initialised it Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * move the import.json wip to a separate file so its more obvious - we'll be using it for testing, emergency fixups, and in the next part of the store work, when we improve migrations and data model lifecycles Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * undo vscode formatting html Signed-off-by: Sven Dowideit <sven.dowideit@portainer.io> * Update missing helm user repo methods * feat(store): implement store tests EE-2112 (#6224) * add store tests * add some more tests * remove redundant comments * add webhook export * update webhooks * fix build issues after rebasing * move migratorparams * remove unneeded integer type conversions * disable the db import/export for now Co-authored-by: Richard Wei <54336863+WaysonWei@users.noreply.github.com> Co-authored-by: cong meng <mcpacino@gmail.com> Co-authored-by: Simon Meng <simon.meng@portainer.io> Co-authored-by: Marcelo Rydel <marcelorydel26@gmail.com> Co-authored-by: Hao Zhang <hao.zhang@portainer.io> Co-authored-by: sunportainer <93502624+sunportainer@users.noreply.github.com> Co-authored-by: sunportainer <ericsun@SG1.local> Co-authored-by: wheresolivia <78844659+wheresolivia@users.noreply.github.com> Co-authored-by: Chaim Lev-Ari <chiptus@users.noreply.github.com> Co-authored-by: Chao Geng <93526589+chaogeng77977@users.noreply.github.com> Co-authored-by: Dmitry Salakhov <to@dimasalakhov.com> Co-authored-by: Matt Hook <hookenz@gmail.com> |
3 years ago |
zees-dev |
69c17986d9
|
feat(api-key/backend): introducing support for api-key based auth EE-978 (#6079)
* feat(access-token): Multi-auth middleware support EE-1891 (#5936) * AnyAuth middleware initial implementation with tests * using mux.MiddlewareFunc instead of custom definition * removed redundant comments * - ExtractBearerToken bouncer func made private - changed helm token handling functionality to use jwt service to convert token to jwt string - updated tests - fixed helm list broken test due to missing token in request context * rename mwCheckAuthentication -> mwCheckJWTAuthentication * - introduce initial api-key auth support using X-API-KEY header - added tests to validate x-api-key request header presence * updated core mwAuthenticatedUser middleware to support multiple auth paradigms * - simplified anyAuth middleware - enforcing authmiddleware to implement verificationFunc interface - created tests for middleware * simplify bouncer Co-authored-by: Dmitry Salakhov <to@dimasalakhov.com> * feat(api-key): user-access-token generation endpoint EE-1889 EE-1888 EE-1895 (#6012) * user-access-token generation endpoint * fix comment * - introduction of apikey service - seperation of repository from service logic - called in handler * fixed tests * - fixed api key prefix - added tests * added another test for digest matching * updated swagger spec for access token creation * api key response returns raw key and struct - easing testability * test for api key prefix length * added another TODO to middleware * - api-key prefix rune -> string (rune does not auto-encode when response sent back to client) - digest -> pointer as we want to allow nil values and omit digest in responses (when nil) * - updated apikey struct - updated apikey service to support all common operations - updated apikey repo - integration of apikey service into bouncer - added test for all apikey service functions - boilerplate code for apikey service integration * - user access token generation tests - apiKeyLookup updated to support query params - added api-key tests for query params - added api-key tests for apiKeyLookup * get and remove access token handlers * get and remove access token handler tests * - delete user deletes all associated api keys - tests for this functionality * removed redundant []byte cast * automatic api-key eviction set within cache for 1 hour * fixed bug with loop var using final value * fixed service comment * ignore bolt error responses * case-insensitive query param check * simplified query var assignment * - added GetAPIKey func to get by unique id - updated DeleteAPIKey func to not require user ID - updated tests * GenerateRandomKey helper func from github.com/gorilla/securecookie moved to codebase * json response casing for api-keys fixed * updating api-key will update the cache * updated golang LRU cache * using hashicorps golang-LRU cache for api keys * simplified jwt check in create user access token * fixed api-key update logic on cache miss * Prefix generated api-keys with `ptr_` (#6067) * prefix api-keys with 'ptr_' * updated apikey description * refactor Co-authored-by: Dmitry Salakhov <to@dimasalakhov.com> * helm list test refactor * fixed user delete test * reduce test nil pointer errors * using correct http 201 created status code for token creation; updated tests * fixed swagger doc user id path param for user access token based endpoints * added api-key security openapi spec to existing jwt secured endpoints (#6091) * fixed flaky test * apikey datecreated and lastused attrs converted to unix timestamp * feat(user): added access token datatable. (#6124) * feat(user): added access token datatable. * feat(tokens): only display lastUsed time when it is not the default date * Update app/portainer/views/account/accountController.js Co-authored-by: zees-dev <63374656+zees-dev@users.noreply.github.com> * Update app/portainer/views/account/accountController.js Co-authored-by: zees-dev <63374656+zees-dev@users.noreply.github.com> * Update app/portainer/views/account/accountController.js Co-authored-by: zees-dev <63374656+zees-dev@users.noreply.github.com> * Update app/portainer/components/datatables/access-tokens-datatable/accessTokensDatatableController.js Co-authored-by: zees-dev <63374656+zees-dev@users.noreply.github.com> * Update app/portainer/services/api/userService.js Co-authored-by: zees-dev <63374656+zees-dev@users.noreply.github.com> * feat(improvements): proposed datatable improvements to speed up dev time (#6138) * modal code update * updated datatable filenames, updated controller to be default class export * fix(access-token): code improvement. Co-authored-by: zees-dev <63374656+zees-dev@users.noreply.github.com> * feat(apikeys): create access token view initial implementation EE-1886 (#6129) * CopyButton implementation * Code component implementation * ToolTip component migration to another folder * TextTip component implementation - continued * form Heading component * Button component updated to be more dynamic * copybutton - small size * form control pass tip error * texttip small text * CreateAccessToken react feature initial implementation * create user access token angularjs view implementation * registration of CreateAccessToken component in AngularJS * user token generation API request moved to angular service, method passed down instead * consistent naming of access token operations; clustered similar code together * any user can add access token * create access token page routing * moved code component to the correct location * removed isadmin check as all functionality applicable to all users * create access token angular view moved up a level * fixed PR issues, updated PR * addressed PR issues/improvements * explicit hr for horizontal line * fixed merge conflict storybook build breaking * - apikey test - cache test * addressed testing issues: - description validations - remove token description link on table * fix(api-keys): user role change evicts user keys in cache EE-2113 (#6168) * user role change evicts user api keys in cache * EvictUserKeyCache -> InvalidateUserKeyCache * godoc for InvalidateUserKeyCache func * additional test line * disable add access token button after adding token to prevent spam Co-authored-by: Dmitry Salakhov <to@dimasalakhov.com> Co-authored-by: fhanportainer <79428273+fhanportainer@users.noreply.github.com> |
3 years ago |
Hui |
e6d690e31e
|
fix(swagger) swagger annotations fixes and improvements EE-1205
|
3 years ago |
Yi Chen |
1633eceed5
|
fix(swagger) Fix openapi issues (#5123)
* * fix api version * fix license info * fix error response schema * fix other typos & mistakes * * remove unused tag * * fix helm issues |
3 years ago |
Chaim Lev-Ari |
50b57614cf
|
docs(api): document apis with swagger (#4678)
* feat(api): introduce swagger * feat(api): anottate api * chore(api): tag endpoints * chore(api): remove tags * chore(api): add docs for oauth auth * chore(api): document create endpoint api * chore(api): document endpoint inspect and list * chore(api): document endpoint update and snapshots * docs(endpointgroups): document groups api * docs(auth): document auth api * chore(build): introduce a yarn script to build api docs * docs(api): document auth * docs(customtemplates): document customtemplates api * docs(tags): document api * docs(api): document the use of token * docs(dockerhub): document dockerhub api * docs(edgegroups): document edgegroups api * docs(edgejobs): document api * docs(edgestacks): doc api * docs(http/upload): add security * docs(api): document edge templates * docs(edge): document edge jobs * docs(endpointgroups): change description * docs(endpoints): document missing apis * docs(motd): doc api * docs(registries): doc api * docs(resourcecontrol): api doc * docs(role): add swagger docs * docs(settings): add swagger docs * docs(api/status): add swagger docs * docs(api/teammembership): add swagger docs * docs(api/teams): add swagger docs * docs(api/templates): add swagger docs * docs(api/users): add swagger docs * docs(api/webhooks): add swagger docs * docs(api/webscokets): add swagger docs * docs(api/stacks): swagger * docs(api): fix missing apis * docs(swagger): regen * chore(build): remove docs from build * docs(api): update tags * docs(api): document tags * docs(api): add description * docs(api): rename jwt token * docs(api): add info about types * docs(api): document types * docs(api): update request types annotation * docs(api): doc registry and resource control * chore(docs): add snippet * docs(api): add description to role * docs(api): add types for settings * docs(status): add types * style(swagger): remove documented code * docs(http/upload): update docs with types * docs(http/tags): add types * docs(api/custom_templates): add types * docs(api/teammembership): add types * docs(http/teams): add types * docs(http/stacks): add types * docs(edge): add types to edgestack * docs(http/teammembership): remove double returns * docs(api/user): add types * docs(http): fixes to make file built * chore(snippets): add scope to swagger snippet * chore(deps): install swag * chore(swagger): remove handler * docs(api): add description * docs(api): ignore docs folder * docs(api): add contributing guidelines * docs(api): cleanup handler * chore(deps): require swaggo * fix(auth): fix typo * fix(docs): make http ids pascal case * feat(edge): add ids to http handlers * fix(docs): add ids * fix(docs): show correct api version * chore(deps): remove swaggo dependency * chore(docs): add install script for swag |
4 years ago |
Chaim Lev-Ari |
db4a5292be
|
refactor(errors): reorganize errors (#3938)
* refactor(bolt): move ErrObjectNotFound to bolt * refactor(http): move ErrUnauthorized to http package * refactor(http): move ErrResourceAccessDenied to http errors * refactor(http): move security errors to package * refactor(users): move user errors to users package * refactor(errors): move single errors to their package * refactor(schedules): move schedule error to package * refactor(http): move endpoint error to http package * refactor(docker): move docker errors to package * refactor(filesystem): move filesystem errors to package * refactor(errors): remove portainer.Error * style(chisel): reorder imports * fix(stacks): remove portainer.Error |
4 years ago |
Anthony Lapenna | 25103f08f9 |
feat(api): introduce new datastore interface (#3802)
* feat(api): introduce new datastore interface * refactor(api): refactor http and main layers * refactor(api): refactor http and bolt layers |
5 years ago |
Chaim Lev-Ari |
8eac1d2221
|
feat(edge-compute): add support for Edge stacks (#3827)
* feat(api): introduce Edge group API (#3639) * feat(edge-groups): add object definition and service definition * feat(edge-groups): implement bolt layer * feat(edge-groups): bind service to server * feat(edge-group): add edge-group create http handler * feat(edge-groups): add list method to edge group handler * feat(edge-group): add inspect http handler * feat(edge-groups): add delete edge-group handler * feat(edge-groups): add update group handler * style(db): order by alphabetical order * fix(edge-groups): rewrite http error messages Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * fix(main): order by alphabetical order * refactor(edge-group): relocate fetch group * fix(edge-group): reset tagids/endpoints if dynamic * refactor(server): order by alphabetical order * refactor(server): order by alphabetical order Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * Introduce a new setting to enable Edge compute features (#3654) * feat(edge-compute): add edge compute setting * feat(edge-compute): add edge compute group to sidebar * fix(settings): rename settings form group * fix(settings): align form control * Edge group associated endpoints (#3659) * chore(version): bump version number * chore(version): bump version number * feat(endpoints): filter by endpoint type (#3646) * refactor(tags): migrate tags to have association objects * refactor(tags): refactor tag management (#3628) * refactor(tags): replace tags with tag ids * refactor(tags): revert tags to be strings and add tagids * refactor(tags): enable search by tag in home view * refactor(tags): show endpoint tags * refactor(endpoints): expect tagIds on create payload * refactor(endpoints): expect tagIds on update payload * refactor(endpoints): replace TagIds to TagIDs * refactor(endpoints): set endpoint group to get TagIDs * refactor(endpoints): refactor tag-selector to receive tag-ids * refactor(endpoints): show tags in multi-endpoint-selector * chore(tags): revert reformat * refactor(endpoints): remove unneeded bind * refactor(endpoints): change param tags to tagids in endpoint create * refactor(endpoints): remove console.log * refactor(tags): remove deleted tag from endpoint and endpoint group * fix(endpoints): show loading label while loading tags * chore(go): remove obsolete import labels * chore(db): add db version comment * fix(db): add tag service to migrator * refactor(db): add error checks in migrator * style(db): sort props in alphabetical order * style(tags): fix typo Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(endpoints): replace tagsMap with tag string representation * refactor(tags): rewrite tag delete to be more readable * refactor(home): rearange code to match former style * refactor(tags): guard against missing model in tag-selector * refactor(tags): rename vars in tag_delete * refactor(tags): allow any authenticated user to fetch tag list * refactor(endpoints): replace controller function with class * refactor(endpoints): replace function with helper * refactor(endpoints): replace controller with class * refactor(tags): revert tags-selector to use 1 way bindings * refactor(endpoints): load empty tag array instead of nil * refactor(endpoints): revert default tag ids * refactor(endpoints): use function in place * refactor(tags): use lodash * style(tags): use parens in arrow functions * fix(tags): remove tag from tag model Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(tags): create tag association when creating tag * refactor(tags): delete tag association when deleting tag * refactor(db): handle error in tag association create * feat(endpoint-group): update tag assoc when creating endpoint group * feat(endpoint-group): update tag association when updating group * feat(endpoint-groups): remove group from tag associations * feat(endpoints): associate endpoint with tag on create * feat(endpoints): edit tag association when updating endpoint * fix(tags): fix merge problems * refactor(tags): remove tag association resource * fix(db): use regular tags map * style(tags): reorder props and imports * refactor(endpoint-groups): replace tag-association with tag * feat(edge-group): get associated endpoints when fetching * refactor(tags): refactor algo to update endpoint and group tags * refactor(edge-group): rename variable * refactor(tags): move calc of tags to remove to global function * fix(tags): update tag after adding association Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * fix(edge-groups): associate groups only with edge endpoints (#3667) * fix(edge-groups): check endpoint type when adding to edge-group * fix(edge-groups): return only edge endpoints for dynamic groups * fix(edge-compute): load edge compute setting on public setting (#3665) * Edge group list (#3644) * feat(edge-groups): add edge module * feat(edge-groups): add edge-group service * feat(edge-group): add groups list view * feat(edge-groups): add link to groups in the sidebar * feat(edge-group): show endpoints count and group type * feat(edge-group): enable removal of edge groups * refactor(edge-groups): replace datatable controller with class * refactor(edge-groups): replace function with class * fix(edge-groups): sort items by endpoints count and group type * refactor(edge-groups): use generic datatable-header component * feat(app): add trace for ui router * fix(edge-compute): add ng injection to onEnter guard * fix(edge-compute): add ng injection to onEnter guard * style(edge-compute): remove space * refactor(edge-compute): import angular * fix(app): remove ui router trace * refactor(product): revert app.js * fix(edge-compute): remove admin guard from edge routes * fix(edge-groups): change label of empty datatable Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(edge-groups): rename service * fix(edge-groups): replace icon in sidebar Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(edge-groups): remove datatable controller * refactor(edge-groups): move datatable icon to binding * refactor(edge-groups): use vanilla datatable header * refactor(datatable): remove datatable header Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(edge): rename edge group to Edge group * feat(edge-groups): edge group creation view (#3671) * feat(edge-groups): add create group view * feat(edge-groups): allow to choose group type * feat(edge-groups): implement create service handler * feat(edge-group): filter by edge endpoints * refactor(edge-groups): rename to camel case * refactor(edge-groups): replace controller with class * feat(endpoints): filter endpoints by type * refactor(edge-groups): remove comments and unneccesary async keyword * refactor(edge-group): use $async service * fix(edge-groups): replace view title Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * fix(edge-groups): change icon Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * fix(edge-groups): change icon Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(edge-groups): remove obsolete function * feat(edge-groups): add empty list messages * feat(edge-group): add description to group types * refactor(edge-groups): add finally block * feat(endpoints): search server in multi-endpoint-selector Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * feat(edge-group) edit view (#3672) * feat(edge-groups): add edit group view * refactor(edge-group): replace edit controller with class * refactor(edge-groups): remove async keyword * refactor(edge-groups): use $async service * refactor(edge-group): remove unnecessary functions * fix(endpoints): group by groups in endpoint-selector * feat(edge-groups): minor UI update * fix(edge-groups): provide defaults for edge group (#3682) * feat(edge-stacks): add basic views and sidebar link (#3689) * feat(edge-stacks): add mock routes * feat(edge-stacks): add link to stacks on sidebar * feat(edge-stacks): add edge stacks view * feat(edge-stacks): add create view * feat(edge-stacks): add edit view * fix(edge-stacks): use class in controller * feat(edge-stacks): add edge-stacks api (#3688) * feat(edge-stack): add edge stack types * feat(edge-stacks): add edge stack service interface * feat(edge-stacks): implement store * feat(edge-stacks): bind service to datastore * feat(edge-stacks): bind service to server * feat(edge-stack): create basic api * feat(edge-stack): create stack api * feat(edge-stacks): update api * refacotor(edge-stack): rename files * feat(edge-stack): update endpoint status * style(edge-stacks): remove comments * feat(edge-stacks): use edge stacks folder for files * fix(edge-stacks): replace bucket name Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * fix(edge-stacks): replace unmarshal function Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * fix(edge-stacks): replace edge stacks path Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * chore(git): merge develop to edge compute (#3692) * feat(support): make support type dynamic (#3621) * chore(version): bump version number * chore(version): bump version number * feat(endpoints): filter by endpoint type (#3646) * chore(assets): double UI image resolutions for HiDPI displays (#3648) Fixes #3069 Prevents users seeing blurry logos and other images when using a hidpi display (like scaled 4k, or a Retina display). These images have been recreated manually with 2x the original resolution but should resemble the originals as much as possible. They have also been run through pngcrush for compression. * fix(services): enforce minimum replica count of 0 (#3653) * fix(services): enforce minimum replica count of 0 Fixes #3652 Prevents replica count from being set below zero and causing an error. * fix(services): enforce replica count is an integer Prevents users entering decimals in the replica count * refactor(tags): refactor tag management (#3628) * refactor(tags): replace tags with tag ids * refactor(tags): revert tags to be strings and add tagids * refactor(tags): enable search by tag in home view * refactor(tags): show endpoint tags * refactor(endpoints): expect tagIds on create payload * refactor(endpoints): expect tagIds on update payload * refactor(endpoints): replace TagIds to TagIDs * refactor(endpoints): set endpoint group to get TagIDs * refactor(endpoints): refactor tag-selector to receive tag-ids * refactor(endpoints): show tags in multi-endpoint-selector * chore(tags): revert reformat * refactor(endpoints): remove unneeded bind * refactor(endpoints): change param tags to tagids in endpoint create * refactor(endpoints): remove console.log * refactor(tags): remove deleted tag from endpoint and endpoint group * fix(endpoints): show loading label while loading tags * chore(go): remove obsolete import labels * chore(db): add db version comment * fix(db): add tag service to migrator * refactor(db): add error checks in migrator * style(db): sort props in alphabetical order * style(tags): fix typo Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(endpoints): replace tagsMap with tag string representation * refactor(tags): rewrite tag delete to be more readable * refactor(home): rearange code to match former style * refactor(tags): guard against missing model in tag-selector * refactor(tags): rename vars in tag_delete * refactor(tags): allow any authenticated user to fetch tag list * refactor(endpoints): replace controller function with class * refactor(endpoints): replace function with helper * refactor(endpoints): replace controller with class * refactor(tags): revert tags-selector to use 1 way bindings * refactor(endpoints): load empty tag array instead of nil * refactor(endpoints): revert default tag ids * refactor(endpoints): use function in place * refactor(tags): use lodash * style(tags): use parens in arrow functions * fix(tags): remove tag from tag model Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * chore(yarn): change start:client to start webpack dev server (#3595) * chore(yarn): change start:client to start webpack dev server * Update package.json Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * create tag from tag selector (#3640) * feat(tags): add button to save tag when doesn't exist * feat(endpoints): allow the creating of tags in endpoint edit * feat(groups): allow user to create tags in create group * feat(groups): allow user to create tags in edit group * feat(endpoint): allow user to create tags from endpoint create * feat(tags): allow the creation of a new tag from dropdown * feat(tag): replace "add" with "create" * feat(tags): show tags input when not tags * feat(tags): hide create message when not allowed * refactor(tags): replace component controller with class * refactor(tags): replace native methods with lodash * refactor(tags): remove unused onChangeTags function * refactor(tags): remove on-change binding * style(tags): remove white space * refactor(endpoint-groups): move controller to separate file * fix(groups): allow admin to create tag in group form * refactor(endpoints): wrap async function with try catch and $async * style(tags): wrap arrow function args with parenthesis * refactor(endpoints): return $async functions * refactor(tags): throw error in the format Notification expects * chore(yarn): add start:client script back (#3691) * feat(endpoints): filter by ids and/or tag ids (#3690) * feat(endpoints): add filter by tagIds * refactor(endpoints): change endpoints service to query by tagIds * fix(endpoints): filter by tags * feat(endpoints): filter by endpoint groups tags * feat(endpoints): filter by ids Co-authored-by: itsconquest <william.conquest@portainer.io> Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> Co-authored-by: Ben Brooks <ben@bbrks.me> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * Chore merge develop to edge compute (#3702) * feat(support): make support type dynamic (#3621) * chore(version): bump version number * chore(version): bump version number * feat(endpoints): filter by endpoint type (#3646) * chore(assets): double UI image resolutions for HiDPI displays (#3648) Fixes #3069 Prevents users seeing blurry logos and other images when using a hidpi display (like scaled 4k, or a Retina display). These images have been recreated manually with 2x the original resolution but should resemble the originals as much as possible. They have also been run through pngcrush for compression. * fix(services): enforce minimum replica count of 0 (#3653) * fix(services): enforce minimum replica count of 0 Fixes #3652 Prevents replica count from being set below zero and causing an error. * fix(services): enforce replica count is an integer Prevents users entering decimals in the replica count * refactor(tags): refactor tag management (#3628) * refactor(tags): replace tags with tag ids * refactor(tags): revert tags to be strings and add tagids * refactor(tags): enable search by tag in home view * refactor(tags): show endpoint tags * refactor(endpoints): expect tagIds on create payload * refactor(endpoints): expect tagIds on update payload * refactor(endpoints): replace TagIds to TagIDs * refactor(endpoints): set endpoint group to get TagIDs * refactor(endpoints): refactor tag-selector to receive tag-ids * refactor(endpoints): show tags in multi-endpoint-selector * chore(tags): revert reformat * refactor(endpoints): remove unneeded bind * refactor(endpoints): change param tags to tagids in endpoint create * refactor(endpoints): remove console.log * refactor(tags): remove deleted tag from endpoint and endpoint group * fix(endpoints): show loading label while loading tags * chore(go): remove obsolete import labels * chore(db): add db version comment * fix(db): add tag service to migrator * refactor(db): add error checks in migrator * style(db): sort props in alphabetical order * style(tags): fix typo Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(endpoints): replace tagsMap with tag string representation * refactor(tags): rewrite tag delete to be more readable * refactor(home): rearange code to match former style * refactor(tags): guard against missing model in tag-selector * refactor(tags): rename vars in tag_delete * refactor(tags): allow any authenticated user to fetch tag list * refactor(endpoints): replace controller function with class * refactor(endpoints): replace function with helper * refactor(endpoints): replace controller with class * refactor(tags): revert tags-selector to use 1 way bindings * refactor(endpoints): load empty tag array instead of nil * refactor(endpoints): revert default tag ids * refactor(endpoints): use function in place * refactor(tags): use lodash * style(tags): use parens in arrow functions * fix(tags): remove tag from tag model Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * chore(yarn): change start:client to start webpack dev server (#3595) * chore(yarn): change start:client to start webpack dev server * Update package.json Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * create tag from tag selector (#3640) * feat(tags): add button to save tag when doesn't exist * feat(endpoints): allow the creating of tags in endpoint edit * feat(groups): allow user to create tags in create group * feat(groups): allow user to create tags in edit group * feat(endpoint): allow user to create tags from endpoint create * feat(tags): allow the creation of a new tag from dropdown * feat(tag): replace "add" with "create" * feat(tags): show tags input when not tags * feat(tags): hide create message when not allowed * refactor(tags): replace component controller with class * refactor(tags): replace native methods with lodash * refactor(tags): remove unused onChangeTags function * refactor(tags): remove on-change binding * style(tags): remove white space * refactor(endpoint-groups): move controller to separate file * fix(groups): allow admin to create tag in group form * refactor(endpoints): wrap async function with try catch and $async * style(tags): wrap arrow function args with parenthesis * refactor(endpoints): return $async functions * refactor(tags): throw error in the format Notification expects * chore(yarn): add start:client script back (#3691) * feat(endpoints): filter by ids and/or tag ids (#3690) * feat(endpoints): add filter by tagIds * refactor(endpoints): change endpoints service to query by tagIds * fix(endpoints): filter by tags * feat(endpoints): filter by endpoint groups tags * feat(endpoints): filter by ids * refactor(project): sort portainer types and interface definitions (#3694) * refactor(portainer): sort types * style(portainer): add comment about role service * refactor(portainer): sort interface types * refactor(portainer): sort enums * Update README.md * Update README.md * Update README.md * chore(project): add prettier for code format (#3645) * chore(project): install prettier and lint-staged * chore(project): apply prettier to html too * chore(project): git ignore eslintcache * chore(project): add a comment about format script * chore(prettier): update printWidth * chore(prettier): remove useTabs option * chore(prettier): add HTML validation * refactor(prettier): fix closing tags * feat(prettier): define angular parser for html templates * style(prettier): run prettier on codebase Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> * chore(prettier): run format on client codebase Co-authored-by: itsconquest <william.conquest@portainer.io> Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> Co-authored-by: Ben Brooks <ben@bbrks.me> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> Co-authored-by: Neil Cresswell <neil@cresswell.net.nz> * feat(edge-stacks): create basic edge stack service (#3704) Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * feat(edge-groups): Provide a switch to use AND or OR for tags (#3695) * feat(edge-groups): add switch to form * feat(project): add property to EdgeGroup * feat(edge-groups): save mustHaveAllTags * feat(edge-groups): fetch associated endpoints (AND and OR) * feat(edge-groups): add AND selector * feat(edge-groups): default to AND * fix(edge-groups): rewrite selector options Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(endpoints): move margin to schedule form * fix(edge-groups): move the selector to top of group * refactor(edge-groups): replace partialMatch property Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * feat(edge-stacks): add Edge stack creation view (#3705) * feat(edge-stacks): basic creation view * feat(edge-stacks): add group selector * feat(edge-stack): create edge stack * fix(code-editor): apply digest cycle after editor is changed * style(project): reformat constants file * feat(edge-stacks): add a note about missing edge groups * fix(edge-stacks): add groups when creating stack from file * feat(edge-groups): add associated endpoints table (#3710) * feat(edge-groups): load associated endpoints * feat(endpoints): add option to filter endpoint by partial match tags * feat(edge-groups): query endpoints by PartialMatch * feat(edge-groups): reload endpoints when form changes * feat(edge-groups): remove columns * feat(edge-group): remove url column * refactor(edge-group): remove props * feat(edge-stacks): add list view (#3713) * feat(edge-stacks): basic datatable * feat(edge-stacks): remove stack * refactor(edge-stacks): convert to class * refactor(edge-stacks): replace id with stackId * feat(edge-stacks) edit edge stack view (#3716) * feat(edge-stack): load file content * feat(edge-stack): edit view * feat(edge-stack): enable update stack * refactor(edge-stacks): move form to component * feat(edge-stacks): add endpoints status * feat(edge-stacks): minor UI update Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> * feat(edge-groups) prevent deletion of edge group used by an edge stack (#3722) * feat(edge-groups): show if group belonges to edge stack * feat(edge-group): protect deletion of used edge group * feat(edge-groups): diable selection of used group * feat(edge-groups): add inuse tag (#3739) * feat(edge-groups): add inuse tag * Update app/edge/components/groups-datatable/groupsDatatable.html Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * feat(edge-stack): update stack version when stack file is changed (#3746) * feat(edge-stack): update version when stack file is changed * refactor(edge-stacks): move update of version to clientside * feat(edge-groups): replace Edge group endpoint selector (#3738) * feat(edge-groups): replace selector * feat(edge-group): add selector in edit form * feat(edge-groups): show tags in endpoint selector * feat(edge-groups): show the endpoint group name * fix(edge-group): remove element from associated endpoints * feat(edge-groups): add group column * feat(edge-groups): move endpoints to other column * fix(groups): disable sort * refactor(endpoints): toggle backend pagination as a property * fix(endpoints): show group name in group-association-table * feat(endpoints): truncate table columns * fix(endpoints): update group association table colspan * fix(endpoint-groups): show dash when no tags Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> * feat(edge-stacks): add api for edge to query stack config (#3748) * refactor(http): move edge validation to bouncer * feat(edge-stacks): add api for edge to query stack config * style(edge-stack): remove parentheses * Update api/http/security/bouncer.go * refactor(edge-stacks): move config inspect to endpoints handler * refactor(endpoints): move stack inspect to edge handler * style(security): fix typo Co-Authored-By: Anthony Lapenna <anthony.lapenna@portainer.io> * refactor(endpoints): rename file Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> * feat(edge-groups): add dynamic group endpoints table (#3780) * fix(edge-stacks): update version when updating stack files (#3778) * feat(edgestacks): change status permission to edge enpoints * feat(edge-compute): add stack info to edge status inspect (#3764) * feat(edge-compute): create helper functions * feat(endpoints): add relation object and service * feat(db): create endpoint relation migration * feat(endpoints): create relation when creating endpoint * feat(endpoints): update relation when updating endpoint * feat(endpoints): delete relation when deleting endpoint * feat(endpoint): add stack status to endpoint_status * feat(edge-stacks): connect new edge stack to endpoint * refactor(edgestack): return errors.New * refactor(edgestacks): return error * refactor(edgegroup): endpoint can be related only if edge endpoint * feat(endpoints): update relation only when tags or groups were changd * refactor(tags): change tags functions to set functions * refactor(edgestack): return a list of endpoints for a list of edgegroups * feat(edgestacks): update relation when updating stack * feat(edgestacks): remove relations when deleting edge stack * feat(edgegroup): update related endpoints * feat(endpoint-group): update endpoints relations on create * feat(endpointgroup): add relatd stacks to endpoint when added to group * feat(endpoint-groups): update relation when group is changed * feat(endpointgroup): when deleting group, update its endpoints relations * feat(tags): update related endpoints when deleting tag * refactor(edge-compute): use pointers * refactor(endpointgroup): handle unassociated endpoint * fix(edgestack): show correct stack status * fix(endpoint): remove deleted endpoint from related tags * feat(edge-stacks): change acknowledged status color to blue (#3810) * feat(edge-compute): provide stack name to edge endpoint (#3809) * feat(edge-groups): when no tags selected show empty list of endpoints (#3811) * feat(edge-groups): when no tags selected show empty list of endpoints * fix(edge-group): change empty associated endpoint text * fix(edge-compute): add missing relations updates (#3817) * fix(endpoint): remove deleted endpoint from edge group * fix(tags): remove deleted tag from edge group * fix(endpoint): remove deleted endpoint from edge stack * fix(edge-groups): remove clearing of edgeGroup fields * fix(edge-groups): show dynamic edge groups without tags * fix(edge-compute): use sequential delete in resources (#3818) * fix(endpoints): delete endpoints on by one * fix(tags): remove tags one by one * fix(groups): remove endpoint groups one by one * fix(edge-stacks): remove stack one by one * fix(edge-groups): remove edge group one by one * fix(edge-stacks): add link to root in breadcrumbs * style(edge): add empty line after errors * refactor(tags): remove old function * refactor(endpoints): revert changes to multi-endpoint-selector * feat(edge-stacks): support Edge stack templates (#3812) * feat(edge-compute): fetch templates from url * feat(edge-stacks): fetch edge templates * feat(edge-stacks): choose template and save * feat(edge-stacks): add placeholder to templates select * feat(edge-templates): show info * fix(edge-stacks): fix typo * feat(edge-templates): replace template url * feat(edge-compute): use custom url if available * fix(edge-stacks): show error message when failing * feat(edge-compute): show description in template * feat(edge-templates): change access to route * style(edge-compute): change EdgeTemplatesURL description Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com> Co-authored-by: itsconquest <william.conquest@portainer.io> Co-authored-by: Ben Brooks <ben@bbrks.me> Co-authored-by: Neil Cresswell <neil@cresswell.net.nz> |
5 years ago |