* feat(internal-auth): ability to set minimum password length [EE-3175]
* pass props to react component
* fixes + WIP slider
* fix slider updating + add styles
* remove nested ternary
* fix slider updating + add remind me later button
* add length to settings + value & onchange method
* finish my account view
* fix slider updating
* slider styles
* update style
* move slider in
* update size of slider
* allow admin to browse to authentication view
* use feather icons instead of font awesome
* feat(settings): add colors to password rules
* clean up tooltip styles
* more style changes
* styles
* fixes + use requiredLength in password field for icon logic
* simplify logic
* simplify slider logic and remove debug code
* use required length for logic to display pwd length warning
* fix slider styles
* use requiredPasswordLength to determine if password is valid
* style tooltip based on theme
* reset skips when password is changed
* misc cleanup
* reset skips when required length is changed
* fix formatting
* fix issues
* implement some suggestions
* simplify logic
* update broken test
* pick min password length from DB
* fix suggestions
* set up min password length in the DB
* fix test after migration
* fix formatting issue
* fix bug with icon
* refactored migration
* fix typo
* fixes
* fix logic
* set skips per user
* reset skips for all users on length change
Co-authored-by: Chaim Lev-Ari <chiptus@gmail.com>
Co-authored-by: Dmitry Salakhov <to@dimasalakhov.com>
* fix(settings): clear helm url if requested [EE-2494]
fix [EE-2494]
before this PR, helm url would clear when updating settings, if the helm url key wasn't provided.
in this PR, it will be changed only if required
* fix(settings): allow empty helm repo
* chore(deps): run yarn
* fix(settings): set helm repo url
* 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>
* fix(helm): allow clearing global helm repo EE-1965
* fix(helm): show hint if global helm repo is blank EE-1965
* fix(helm): skip loading charts if repo is blank EE-1965
Co-authored-by: Simon Meng <simon.meng@portainer.io>
* allow settings to be saved offline. Due to helm repo validation not working for bitnami when offline!
* @hookenz
dont validate the helm repo if the repo hasn't changed or is the default
* feat(kubeshell) allow overriding default kubeshell
* Add missing error check and struct tag
* Add migrator for kube shell image and add it as a default in the db
* Fix file name to match migrator pattern
* remove default as it's now coming from the db
* remove blank line
* - conflict resolution code update
- logging migration error on migration failures
* - migrateDBVersionTo34 -> migrateDBVersionToDB34 (naming consistency)
Co-authored-by: zees-dev <dev.786zshan@gmail.com>
* feat(helm): add helm chart backport to ce EE-1409 (#5425)
* EE-1311 Helm Chart Backport from EE
* backport to ce
Co-authored-by: Matt Hook <hookenz@gmail.com>
* feat(helm): list and configure helm chart (#5431)
* backport and tidyup code
* --amend
* using rocket icon for charts
* helm chart bugfix - clear category button
* added matomo analytics for helm chart install
* fix web editor exit warning without changes
* editor modified exit bugfix
* fixed notifications typo
* updated helm template text
* helper text to convey slow helm templates load
Co-authored-by: zees-dev <dev.786zshan@gmail.com>
* removing redundant time-consuming api call by using prop attribute
* feat(helm) helm chart backport from ee EE-1311 (#5436)
* Add missing defaultHelmRepoUrl and mock testing
* Backport EE-1477
* Backport updates to helm tests from EE
* add https by default changes and ssl to tls renaming from EE
* Port install integration test. Disabled by default to pass CI checks
* merged changes from EE for the integration test
* kube proxy whitelist updated to support internal helm install command
Co-authored-by: zees-dev <dev.786zshan@gmail.com>
* Pull in all changes from tech review in EE-943
* added helm to sidebar after rebase, sync CE with EE
* bugfix: kubectl shell not opening - bearer token bug
* tidy go modules & remove yarn-error.log
* removed redundant handler (not used) - to match EE
* resolved merge conflicts, updated code
* feat(helm/views): helm release and application views EE-1236 (#5529)
* feat(helm): add helm chart backport to ce EE-1409 (#5425)
* EE-1311 Helm Chart Backport from EE
* backport to ce
Co-authored-by: Matt Hook <hookenz@gmail.com>
* Pull in all changes from tech review in EE-943
* added helm to sidebar after rebase, sync CE with EE
* removed redundant handler (not used) - to match EE
* feat(helm) display helm charts - backend EE-1236
* copy over components for new applications view EE-1236
* Add new applications datatable component
* Add more migrated files
* removed test not applicable to CE
* baclkported EE app data table code to CE
* removed redundant helm repo url
* resolved conflicts, updated code
* using endpoint middleware
* PR review fixes
* using constants, openapi updated
Co-authored-by: Richard Wei <54336863+WaysonWei@users.noreply.github.com>
Co-authored-by: zees-dev <dev.786zshan@gmail.com>
* fixed test conflicts, go linted
* feat(helm/templates-add): helm templates add repo for user support EE-1278 (#5514)
* feat(helm): add helm chart backport to ce EE-1409 (#5425)
* EE-1311 Helm Chart Backport from EE
* backport to ce
Co-authored-by: Matt Hook <hookenz@gmail.com>
* feat(helm) helm chart backport from ee EE-1311 (#5436)
* Add missing defaultHelmRepoUrl and mock testing
* Backport EE-1477
* Backport updates to helm tests from EE
* add https by default changes and ssl to tls renaming from EE
* Port install integration test. Disabled by default to pass CI checks
* merged changes from EE for the integration test
* kube proxy whitelist updated to support internal helm install command
Co-authored-by: zees-dev <dev.786zshan@gmail.com>
* Pull in all changes from tech review in EE-943
* feat(helm): add helm chart backport to ce EE-1409 (#5425)
* EE-1311 Helm Chart Backport from EE
* backport to ce
Co-authored-by: Matt Hook <hookenz@gmail.com>
* Pull in all changes from tech review in EE-943
* added helm to sidebar after rebase, sync CE with EE
* backport EE-1278, squashed, diffed, updated
* helm install openapi spec update
* resolved conflicts, updated code
* - matching ee codebase at 0afe57034449ee0e9f333d92c252a13995a93019
- helm install using endpoint middleware
- remove trailing slash from added/persisted helm repo urls
* feat(helm) use libhelm url validator and improved path assembly EE-1554 (#5561)
* feat(helm/userrepos) fix getting global repo for ordinary users EE-1562 (#5567)
* feat(helm/userrepos) fix getting global repo for ordinary users EE-1562
* post review changes and further backported changes from EE
* resolved conflicts, updated code
* fixed helm_install handler unit test
* user cannot add existing repo if suffix is '/' (#5571)
* feat(helm/docs) fix broken swagger docs EE-1278 (#5572)
* Fix swagger docs
* minor correction
* fix(helm): migrating code from user handler to helm handler (#5573)
* - migrated user_helm_repos to helm endpoint handler
- migrated api operations from user factory/service to helm factory/service
- passing endpointId into helm service/factory as endpoint provider is deprecated
* upgrade libhelm to hide secrets
Co-authored-by: Matt Hook <hookenz@gmail.com>
* removed duplicate file - due to merge conflict
* dependency injection in helm factory
Co-authored-by: Richard Wei <54336863+WaysonWei@users.noreply.github.com>
Co-authored-by: Matt Hook <hookenz@gmail.com>
* kubernetes.templates -> kubernetes.templates.helm name conflict fix
* Validate the URL added as a public helm repo (#5579)
* fix(helm): helm app deletion fix EE-1581 (#5582)
* updated helm lib to show correct error on uninstall failure
* passing down helm app namespace on deletion
* fix(k8s): EE-1591 non-admin users cannot deploy charts containing secrets (#5590)
Co-authored-by: Simon Meng <simon.meng@portainer.io>
* fix(helm): helm epic bugfixes EE-1582 EE-1593 (#5585)
* - trim trailing slash and lowercase before persisting helm repo
- browser helm templates url /kubernetes/templates/templates -> /kubernetes/templates/helm
- fix publish url
- fix helm repo add refresh
- semi-fix k8s app expansion
* Tidy up swagger documentation related to helm. Make json consistent
* fixed helm release page for non-default namespaces
* k8s app view table expansion bugfix
* EE-1593: publish url load balancer fallback
Co-authored-by: Matt Hook <hookenz@gmail.com>
* k8s app list fix for charts with deployments containing multiple pods - which use the same label (#5599)
* fix(kubernetes): app list view fix for secrets with long keys or values EE-1600 (#5600)
* k8s app secrets key value text overflow ellipses
* wrapping key value pairs instead of ellipses
* fix(helm): helm apps bundling issue across different namespaces EE-1619 (#5602)
* helm apps bundling issue across different namespaces
* - code comments and indentation to ease reading
- moved namespace calc out of loop
* feat(helm/test) disable slow helm search test by default EE-1599 (#5598)
* skip helm_repo_search as it's an integration test
* switch to portainer built in integration test checker
* make module order match EE
* don't print test struct out when skipping integration test
Co-authored-by: Richard Wei <54336863+WaysonWei@users.noreply.github.com>
Co-authored-by: Matt Hook <hookenz@gmail.com>
Co-authored-by: cong meng <mcpacino@gmail.com>
Co-authored-by: Simon Meng <simon.meng@portainer.io>
* feat(kubeconfig) EE-1153 Introduce the ability to change the expiry of a kubeconfig
* feat(kubeconfig) EE-1153 pr feedback update
* feat(kubeconfig) EE-1153 code cleanup
Co-authored-by: Simon Meng <simon.meng@portainer.io>
* feat(settings): introduce settings to allow/disable
* feat(settings): update the setting
* feat(docker): prevent user from using caps if disabled
* refactor(stacks): revert file
* style(api): remove portainer ns
* feat(stacks): add a setting to disable the creation of stacks for non-admin users
* feat(settings): introduce a setting to prevent non-admin from stack creation
* feat(settings): update stack creation setting
* feat(settings): fail stack creation if user is non admin
* fix(settings): save preventStackCreation setting to state
* feat(stacks): disable add button when settings is enabled
* format(stacks): remove line
* feat(stacks): setting to hide stacks from users
* feat(settings): rename disable stacks setting
* refactor(settings): rename setting to disableStackManagementForRegularUsers
* feat(settings): hide stacks for non admin when settings is set
* refactor(settings): replace disableDeviceMapping with allow
* feat(dashboard): hide stacks if settings disabled and non admin
* refactor(sidebar): check if user is endpoint admin
* feat(settings): set the default value for stack management
* feat(settings): rename field label
* fix(sidebar): refresh show stacks state
* fix(docker): hide stacks when not admin
* feat(settings): add setting to disable device mapping for regular users
* feat(settings): introduce device mapping service
* feat(containers): hide devices field when setting is on
* feat(containers): prevent passing of devices when not allowed
* feat(stacks): prevent non admin from device mapping
* feat(stacks): disallow swarm stack creation for user
* refactor(settings): replace disableDeviceMapping with allow
* fix(stacks): remove check for disable device mappings from swarm
* feat(settings): rename field to disable
* feat(settings): supply default value for disableDeviceMapping
* feat(container): check for endpoint admin
* style(server): sort imports
* feat(containers): prevent non-admin users from running containers using the host namespace pid (#3970)
* feat(containers): Prevent non-admin users from running containers using the host namespace pid
* feat(containers): add rbac check for swarm stack too
* feat(containers): remove forgotten conflict
* feat(containers): init EnableHostNamespaceUse to true and return 403 on forbidden action
* feat(containers): change enableHostNamespaceUse to restrictHostNamespaceUse in html
* feat(settings): rename EnableHostNamespaceUse to AllowHostNamespaceForRegularUsers
* feat(database): trigger migration for AllowHostNamespace
* feat(containers): check container creation authorization
Co-authored-by: Maxime Bajeux <max.bajeux@gmail.com>
* feat(auth): introduce new timeout constant
* feat(auth): pass timeout from handler
* feat(auth): add timeout selector to auth settings view
* feat(settings): add user session timeout property
* feat(auth): load user session timeout from settings
* fix(settings): use correct time format
* feat(auth): remove no-auth flag
* refactor(auth): move timeout mgmt to jwt service
* refactor(client): remove no-auth checks from client
* refactor(cli): remove defaultNoAuth
* feat(settings): create settings with default user timeout value
* refactor(db): save user session timeout always
* refactor(jwt): return error
* feat(auth): set session timeout in jwt service on update
* feat(auth): add description and time settings
* feat(auth): parse duration
* feat(settings): validate user timeout format
* refactor(settings): remove unneccesary import
* 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>
* refactor(api): refactor base import path
* fix(build-system): update build_binary_devops
* fix(build-system): fix build_binary_devops for linux
* fix(build-system): fix build_binary_devops for Windows
* feat(settings): add the capability to enable/disable the host management features
* feat(settings): remove the validation of EnableHostManagementFeatures in frontend
* feat(api): disable schedules API when HostManagementFeatures is false + DB migration
* style(settings): update host management settings tooltip
* refacot(schedules): update DBVersion to 15