* 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(volumes): add a switch to use CIFS volumes
* feat(volumes): switch between nfs and cifs
* feat(volumes): autofix sharepoint, hide driveroptions and allow to create unnammed volume
* feat(volumes): change cifs version select options
* feat(volumes): change few things
* 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>
* 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(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>
* feat(api): experiment with go mod
* feat(api): experiment with go mod
* feat(api): experiment with go mod
* feat(api): add go module support
* refactor(api): go fmt
* feat(api): gitlab registry type
* feat(registries): early support for gitlab registries
* feat(app): registry service selector
* feat(registry): gitlab support : list repositories and tags - remove features missing
* feat(registry): gitlab registry remove features
* feat(registry): gitlab switch to registry V2 API for repositories and tags
* feat(api): use development extension binary
* fix(registry): avoid 401 on gitlab retrieve to disconnect the user
* feat(registry): gitlab browse projects without extension
* style(app): code cleaning
* refactor(app): PR review changes + refactor on types
* fix(gitlab): remove gitlab info from registrymanagementconfig and force gitlab type
* style(api): go fmt
* feat(api): update APIVersion and ExtensionDefinitionsURL
* fix(api): fix invalid RM extension URL
* feat(registry): PAT scope help
* feat(registry): defaults on registry creation
* style(registry-creation): update layout and text for Gitlab registry
* feat(registry-creation): update gitlab notice
* feat(api): relocate authorizations outside of JWT
* fix(api): update user authorization after enabling the RBAC extension
* feat(api): add PortainerEndpointList operation in the default portainer authorizations
* feat(auth): retrieve authorization from API instead of JWT
* refactor(auth): move permissions retrieval to function
* refactor(api): document authorizations methods
* feat(api): remove SnapshotRaw from EndpointList response
* feat(api): add pagination for EndpointList operation
* feat(api): rename last_id query parameter to start
* feat(api): implement filter for EndpointList operation
* feat(home): front - endpoint backend pagination (#2990)
* feat(home): endpoint pagination with backend
* feat(api): remove default limit value
* fix(endpoints): fix a minor issue with column span
* fix(endpointgroup-create): fix an issue with endpoint group creation
* feat(app): minor loading optimizations
* refactor(api): small refactor of EndpointList operation
* fix(home): fix minor loading text display issue
* refactor(api): document bolt services functions
* feat(home): minor optimization
* fix(api): replace seek with index scanning for EndpointPaginated
* fix(api): fix invalid starting index issue
* fix(api): first implementation of working filter
* fix(home): endpoints list keeps backend pagination when it needs to
* fix(api): endpoint pagination doesn't drop the first item on pages >=2 anymore
* fix(home): UI flickering on page/filter load/change
* feat(api): support searching in associated endpoint group data
* feat(api): declare EndpointList params as optional
* feat(endpoints): backend pagination for endpoints view (#3004)
* feat(endpoint-group): enable backend pagination (#3017)
* feat(api): support groupID filter on endpoints route
* feat(api): add new API operations endpointGroupAddEndpoint and endpointGroupDeleteEndpoint
* feat(endpoint-groups): backend pagination support for create and edit
* feat(endpoint-groups): debounce on filter for create/edit views
* feat(endpoint-groups): filter assigned on create view
* (endpoint-groups): unassigned endpoints edit view
* refactor(endpoint-groups): code clean
* feat(endpoint-groups): remove message for Unassigned group
* refactor(api): endpoint group endpoint association refactor
* refactor(api): rename files and remove comments
* refactor(api): remove usage of utils
* refactor(api): optional parameters
* feat(api): update endpointListOperation behavior and parameters
* refactor(api): remove unused methods associated to EndpointService
* refactor(api): remove unused methods associated to EndpointService
* refactor(api): minor refactor
* 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(registries): registries accessibility to all authorized people and not only admins
* feat(registry): dockerhub settings for admin only
* feat(registry): remove registry config access for non admin users
* feat(api): use AuthenticatedAccess policy instead of RestrictedAccess for extensionList operation
* refactor(api): minor update to security package
* refactor(api): revert unexporting function changes
* refactor(api): apply gofmt
* feat(api): add a new Recurring property on Schedule
* feat(schedules): date to cron convert + recurring flag
* feat(schedules): update angularjs-datetime-picker from v1 to v2
* chore(app): use minified dependency for angularjs-datetime-picker
* chore(vendor): rollback version of angularjs-datetime-picker
* * feat(ux): replace datepicker for schedule creation/details
* feat(container-stats): add refresh rate of 1 and 3 seconds (#2493)
* fix(templates): set var to default value if no value selected (#2323)
* fix(templates): set preset to true iff var type is preset
* fix(templates): add env var value when changing type
* feat(security): shutdown instance after 5minutes if no admin account created (#2500)
* feat(security): skip admin check if --no-auth
* fix(security): change error message
* fix(vendor): use datepicker minified version
* feat(schedule-creation): replace angular-datetime-picker
* feat(schedule): parse cron to datetime
* fix(schedule): fix zero based months
* 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
* feat(back): saved data in snapshot
* feat(endpoints): adding interceptors to retrieve saved data on offline endpoints
* feat(endpoints): offline dashboard working - need tests on offline views
* refactor(endpoints): interceptors cleaning and saving/loading offline endpoints data in/from localstorage
* feat(endpoints): browsing offline endpoints
* feat(endpoints): removing all the link in offline mode - sidebar not working when switching between off and on modes w/ stateManager logic
* feat(endpoints): endpoint status detection in real time
* fix(endpoints): offline swarm endpoint are not accessible anymore
* fix(endpoints): refactor message + disable offline browsing for an endpoint when no snapshot is available for it
* fix(endpoints): adding timeout and enabling loading bar for offline requests
* fix(endpoints): trying to access a down endpoint wont remove sidebar items if it fails
* feat(endpoints): disable checkboxes on offline views for offline mode
* feat(endpoints): updating endpoint status when detecting a change
* refactor(host): moved offline status panel from engine view to new host view
* fix(endpoints): missing endpoint update on ping from home view
* fix(api): rework EndpointUpdate operation
* refactor(offline): moved endpoint status to EndpointProvider and refactor the status-changed detection
* fix(offline): moved status detection to callback on views -> prevent displaying the offline message when endpoint is back online on view change
* fix(offline): offline message is now displayed online when browsing an offline endpoint
* fix(offline): sidebar updates correctly on endpoint status change
* fix(offline): offline panel not displayed and hidden on online mode
* refactor(offline): rework of OfflineMode management
* refactor(offline): extract information-panel for offlineMode into a component
* refactor(offline): remove redundant binding of informationPanel + endpointStatusInterceptor patter as service
* refactor(interceptors): moved interceptors pattern to service pattern
* feat(stacks): prevent inspection of a stack in offline mode
* feat(host): hide devices/disk panels in offline mode
* feat(host): disable browse action in offline mode
* refactor(home): remove comments
* feat(jobs): adding the ability to run scripts on endpoints
fix(job): click on containerId in JobsDatatable redirects to container's logs
refactor(job): remove the jobs datatable settings + texts changes on JobCreation view
fix(jobs): jobs payloads are now following API rules and case
feat(jobs): adding the capability to run scripts on hosts
* feat(jobs): adding the ability to purge jobs containers
* refactor(job): apply review changes
* feat(job-creation): store image name in local storage
* feat(host): disable job exec link in non-agent Swarm setup
* feat(host): only display execute job in agent setups or standalone
* feat(job): job execution overhaul
* docs(swagger): update EndpointJob documentation
* feat(stack-details): add duplicate-stack button
* feat(stack-details): add stack-duplication-form component
* feat(stack-details): add duplicate stack method on controller
* feat(stack-details): add duplicate stack method
* feat(stack-details): remove old duplication in progress flag
* feat(stack-details): combine migration and duplication forms
* feat(stack-details): pass new stack name to server
* feat(stack-details): add option to rename migrated stack
* feat(stack-details): disable both migrate/duplicate buttons
* feat(stack-details): disable migration button on same endpoint
* feat(stack-details): change duplicate icon
* style(stack-details): remove whitespaces and fix pattern
* feat(stack-details): add name to migration payload in swagger.yml
* style(stack-details): add semicolon
* bug(stack-details): toggle endpoints before and after duplication
* Initial pass at adding webhook controller and routes
* Moving some objects around
* Cleaning up comments
* Fixing syntax, switching to using the docker sdk over building an http client
* Adding delete and list functionality
* Updating the handler to use the correct permissions. Updating some comments
* Fixing some comments
* Code cleanup per pull request comments
* Cleanup per PR feedback. Syntax error fix
* Initial creation of webhook app code
* Moving ClientFactory creation out of handler code and instead using the one created by the main process. Removing webhookInspect method and updating the list function to use json filters
* Delete now works on the webhook ID vs service ID
* WIP - Service creates a webhook. Display will show an existing webhook URL.
* Adding the webhook field to the service view. There is now the ability to add or remove a webhook from a service
* Moving all api calls to be webhooks vs webhook
* Code cleanup. Moving all api calls to be webhooks vs webhook
* More conversion of webhook to webhooks?
* Moving UI elements around. Starting function for copying to clipboard
* Finalizing function for copying to clipboard. Adding button that calls function and copies webhook to clipboard.
* Fixing UI issues. Hiding field entirely when there is no webhook
* Moving URL crafting to a helper method. The edit pane for service now creates/deletes webhooks immidiately.
* style(service-details): update webhook line
* feat(api): strip sha when updating an image via the update webhook
* Fixing up some copy. Only displying the port if it is not http or https
* Fixing tooltip copy. Setting the forceupdate to be true to require an update to occur
* Fixing code climate errors
* Adding WebhookType field and setting to ServiceWebhook for new webhooks. Renaming ServiceID to resourceID so future work can add new types of webhooks in other resource areas.
* Adding the webhook type to the payload to support more types of webhooks in the future. Setting the type correctly when creating one for a service
* feat(webhooks): changes related to webhook management
* API code cleanup, removing unneeded functions, and updating validation logic
* Incorrectly ignoring the error that the webhook did not exist
* Re-adding missing error handling. Changing error response to be a 404 vs 500 when token can't find an object
* fix(webhooks): close Docker client after service webhook execution
* feat(api): add motd handler
* feat(app): add the motd api layer
* feat(motd): display motd and add the ability to dismiss information messages
* style(home): relocate important message before info01
* feat(api): silently fail when an error occurs during motd retrieval
* #960 feat(UAC): change ownership to admins for externally created ressources
* feat(UAC): change ownership to admins for externally created resources
Deprecated AdministratorsOnly js and go backend
* #960 feat(UAC): remove AdministratorsOnly property and minor GUI fixes
Update swagger definition changing AdministratorsOnly to Public
* #960 feat(UAC): fix create resource with access control data
* #960 feat(UAC): authorization of non-admin users for restricted operations
On stacks, containers networks, services , tasks and volumes.
* #960 feat(UAC): database migration to version 14
The administrator resources are deleted and Public resources are now managed by admins
* #960 feat(UAC): small fixes from PR #2137
* #960 feat(UAC): improve the readability of the source code
* feat(UAC) fix displayed ownership for Swarm related resources (#960)
* feat(api): add a setting to toggle automatic user provisioning when using LDAP authentication
* fix(auth): fix an issue with AutoCreateUsers disabled
* feat(stacks): add the ability to migrate stacks to another endpoint
* feat(stack-details): do not redirect to alternate endpoint after migration
* fix(api): fix merge conflicts
* feat(stack-details): add a modal to confirm stack migration
* fix(api): add an authenticated access policy to the websocket endpoint
* refactor(api): centralize EndpointAccess validation
* feat(api): validate id query parameter for the /websocket/exec endpoint
This involves copying and modifying go's httputil.NewSingleHostReverseProxy, which is documented to (perhaps surprisingly) leave the Host header untouched. Instead, we set the Host header to the target host for the connection for the benefit of name based virtual host proxies that make use of this. The value it would otherwise have in this app, typically 'localhost:8000', is strange and unlikely to be any use.
See golang/go#7618 and golang/go#10342