mirror of
https://github.com/portainer/portainer.git
synced 2025-07-19 13:29:41 +02:00
* 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>
1421 lines
61 KiB
Go
1421 lines
61 KiB
Go
package portainer
|
|
|
|
import "time"
|
|
|
|
type (
|
|
// AccessPolicy represent a policy that can be associated to a user or team
|
|
AccessPolicy struct {
|
|
RoleID RoleID `json:"RoleId"`
|
|
}
|
|
|
|
// APIOperationAuthorizationRequest represent an request for the authorization to execute an API operation
|
|
APIOperationAuthorizationRequest struct {
|
|
Path string
|
|
Method string
|
|
Authorizations Authorizations
|
|
}
|
|
|
|
// AuthenticationMethod represents the authentication method used to authenticate a user
|
|
AuthenticationMethod int
|
|
|
|
// Authorization represents an authorization associated to an operation
|
|
Authorization string
|
|
|
|
// Authorizations represents a set of authorizations associated to a role
|
|
Authorizations map[Authorization]bool
|
|
|
|
// AzureCredentials represents the credentials used to connect to an Azure
|
|
// environment.
|
|
AzureCredentials struct {
|
|
ApplicationID string `json:"ApplicationID"`
|
|
TenantID string `json:"TenantID"`
|
|
AuthenticationKey string `json:"AuthenticationKey"`
|
|
}
|
|
|
|
// CLIFlags represents the available flags on the CLI
|
|
CLIFlags struct {
|
|
Addr *string
|
|
TunnelAddr *string
|
|
TunnelPort *string
|
|
AdminPassword *string
|
|
AdminPasswordFile *string
|
|
Assets *string
|
|
Data *string
|
|
EndpointURL *string
|
|
ExternalEndpoints *string
|
|
Labels *[]Pair
|
|
Logo *string
|
|
NoAuth *bool
|
|
NoAnalytics *bool
|
|
Templates *string
|
|
TemplateFile *string
|
|
TLS *bool
|
|
TLSSkipVerify *bool
|
|
TLSCacert *string
|
|
TLSCert *string
|
|
TLSKey *string
|
|
SSL *bool
|
|
SSLCert *string
|
|
SSLKey *string
|
|
SyncInterval *string
|
|
Snapshot *bool
|
|
SnapshotInterval *string
|
|
}
|
|
|
|
// CLIService represents a service for managing CLI
|
|
CLIService interface {
|
|
ParseFlags(version string) (*CLIFlags, error)
|
|
ValidateFlags(flags *CLIFlags) error
|
|
}
|
|
|
|
// DataStore defines the interface to manage the data
|
|
DataStore interface {
|
|
Open() error
|
|
Init() error
|
|
Close() error
|
|
MigrateData() error
|
|
}
|
|
|
|
// DockerHub represents all the required information to connect and use the
|
|
// Docker Hub
|
|
DockerHub struct {
|
|
Authentication bool `json:"Authentication"`
|
|
Username string `json:"Username"`
|
|
Password string `json:"Password,omitempty"`
|
|
}
|
|
|
|
// EdgeGroup represents an Edge group
|
|
EdgeGroup struct {
|
|
ID EdgeGroupID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
Dynamic bool `json:"Dynamic"`
|
|
TagIDs []TagID `json:"TagIds"`
|
|
Endpoints []EndpointID `json:"Endpoints"`
|
|
PartialMatch bool `json:"PartialMatch"`
|
|
}
|
|
|
|
// EdgeGroupID represents an Edge group identifier
|
|
EdgeGroupID int
|
|
|
|
// EdgeSchedule represents a scheduled job that can run on Edge environments.
|
|
EdgeSchedule struct {
|
|
ID ScheduleID `json:"Id"`
|
|
CronExpression string `json:"CronExpression"`
|
|
Script string `json:"Script"`
|
|
Version int `json:"Version"`
|
|
Endpoints []EndpointID `json:"Endpoints"`
|
|
}
|
|
|
|
//EdgeStack represents an edge stack
|
|
EdgeStack struct {
|
|
ID EdgeStackID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
Status map[EndpointID]EdgeStackStatus `json:"Status"`
|
|
CreationDate int64 `json:"CreationDate"`
|
|
EdgeGroups []EdgeGroupID `json:"EdgeGroups"`
|
|
ProjectPath string `json:"ProjectPath"`
|
|
EntryPoint string `json:"EntryPoint"`
|
|
Version int `json:"Version"`
|
|
Prune bool `json:"Prune"`
|
|
}
|
|
|
|
//EdgeStackID represents an edge stack id
|
|
EdgeStackID int
|
|
|
|
//EdgeStackStatus represents an edge stack status
|
|
EdgeStackStatus struct {
|
|
Type EdgeStackStatusType `json:"Type"`
|
|
Error string `json:"Error"`
|
|
EndpointID EndpointID `json:"EndpointID"`
|
|
}
|
|
|
|
//EdgeStackStatusType represents an edge stack status type
|
|
EdgeStackStatusType int
|
|
|
|
// Endpoint represents a Docker endpoint with all the info required
|
|
// to connect to it
|
|
Endpoint struct {
|
|
ID EndpointID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
Type EndpointType `json:"Type"`
|
|
URL string `json:"URL"`
|
|
GroupID EndpointGroupID `json:"GroupId"`
|
|
PublicURL string `json:"PublicURL"`
|
|
TLSConfig TLSConfiguration `json:"TLSConfig"`
|
|
Extensions []EndpointExtension `json:"Extensions"`
|
|
AzureCredentials AzureCredentials `json:"AzureCredentials,omitempty"`
|
|
TagIDs []TagID `json:"TagIds"`
|
|
Status EndpointStatus `json:"Status"`
|
|
Snapshots []Snapshot `json:"Snapshots"`
|
|
UserAccessPolicies UserAccessPolicies `json:"UserAccessPolicies"`
|
|
TeamAccessPolicies TeamAccessPolicies `json:"TeamAccessPolicies"`
|
|
EdgeID string `json:"EdgeID,omitempty"`
|
|
EdgeKey string `json:"EdgeKey"`
|
|
// Deprecated fields
|
|
// Deprecated in DBVersion == 4
|
|
TLS bool `json:"TLS,omitempty"`
|
|
TLSCACertPath string `json:"TLSCACert,omitempty"`
|
|
TLSCertPath string `json:"TLSCert,omitempty"`
|
|
TLSKeyPath string `json:"TLSKey,omitempty"`
|
|
|
|
// Deprecated in DBVersion == 18
|
|
AuthorizedUsers []UserID `json:"AuthorizedUsers"`
|
|
AuthorizedTeams []TeamID `json:"AuthorizedTeams"`
|
|
|
|
// Deprecated in DBVersion == 22
|
|
Tags []string `json:"Tags"`
|
|
}
|
|
|
|
// EndpointAuthorizations represents the authorizations associated to a set of endpoints
|
|
EndpointAuthorizations map[EndpointID]Authorizations
|
|
|
|
// EndpointExtension represents a deprecated form of Portainer extension
|
|
// TODO: legacy extension management
|
|
EndpointExtension struct {
|
|
Type EndpointExtensionType `json:"Type"`
|
|
URL string `json:"URL"`
|
|
}
|
|
|
|
// EndpointExtensionType represents the type of an endpoint extension. Only
|
|
// one extension of each type can be associated to an endpoint
|
|
EndpointExtensionType int
|
|
|
|
// EndpointGroup represents a group of endpoints
|
|
EndpointGroup struct {
|
|
ID EndpointGroupID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
Description string `json:"Description"`
|
|
UserAccessPolicies UserAccessPolicies `json:"UserAccessPolicies"`
|
|
TeamAccessPolicies TeamAccessPolicies `json:"TeamAccessPolicies"`
|
|
TagIDs []TagID `json:"TagIds"`
|
|
|
|
// Deprecated fields
|
|
Labels []Pair `json:"Labels"`
|
|
|
|
// Deprecated in DBVersion == 18
|
|
AuthorizedUsers []UserID `json:"AuthorizedUsers"`
|
|
AuthorizedTeams []TeamID `json:"AuthorizedTeams"`
|
|
|
|
// Deprecated in DBVersion == 22
|
|
Tags []string `json:"Tags"`
|
|
}
|
|
|
|
// EndpointGroupID represents an endpoint group identifier
|
|
EndpointGroupID int
|
|
|
|
// EndpointID represents an endpoint identifier
|
|
EndpointID int
|
|
|
|
// EndpointStatus represents the status of an endpoint
|
|
EndpointStatus int
|
|
|
|
// EndpointSyncJob represents a scheduled job that synchronize endpoints based on an external file
|
|
EndpointSyncJob struct{}
|
|
|
|
// EndpointType represents the type of an endpoint
|
|
EndpointType int
|
|
|
|
// EndpointRelation represnts a endpoint relation object
|
|
EndpointRelation struct {
|
|
EndpointID EndpointID
|
|
EdgeStacks map[EdgeStackID]bool
|
|
}
|
|
|
|
// Extension represents a Portainer extension
|
|
Extension struct {
|
|
ID ExtensionID `json:"Id"`
|
|
Enabled bool `json:"Enabled"`
|
|
Name string `json:"Name,omitempty"`
|
|
ShortDescription string `json:"ShortDescription,omitempty"`
|
|
Description string `json:"Description,omitempty"`
|
|
DescriptionURL string `json:"DescriptionURL,omitempty"`
|
|
Price string `json:"Price,omitempty"`
|
|
PriceDescription string `json:"PriceDescription,omitempty"`
|
|
Deal bool `json:"Deal,omitempty"`
|
|
Available bool `json:"Available,omitempty"`
|
|
License LicenseInformation `json:"License,omitempty"`
|
|
Version string `json:"Version"`
|
|
UpdateAvailable bool `json:"UpdateAvailable"`
|
|
ShopURL string `json:"ShopURL,omitempty"`
|
|
Images []string `json:"Images,omitempty"`
|
|
Logo string `json:"Logo,omitempty"`
|
|
}
|
|
|
|
// ExtensionID represents a extension identifier
|
|
ExtensionID int
|
|
|
|
// GitlabRegistryData represents data required for gitlab registry to work
|
|
GitlabRegistryData struct {
|
|
ProjectID int `json:"ProjectId"`
|
|
InstanceURL string `json:"InstanceURL"`
|
|
ProjectPath string `json:"ProjectPath"`
|
|
}
|
|
|
|
// JobType represents a job type
|
|
JobType int
|
|
|
|
// LDAPGroupSearchSettings represents settings used to search for groups in a LDAP server
|
|
LDAPGroupSearchSettings struct {
|
|
GroupBaseDN string `json:"GroupBaseDN"`
|
|
GroupFilter string `json:"GroupFilter"`
|
|
GroupAttribute string `json:"GroupAttribute"`
|
|
}
|
|
|
|
// LDAPSearchSettings represents settings used to search for users in a LDAP server
|
|
LDAPSearchSettings struct {
|
|
BaseDN string `json:"BaseDN"`
|
|
Filter string `json:"Filter"`
|
|
UserNameAttribute string `json:"UserNameAttribute"`
|
|
}
|
|
|
|
// LDAPSettings represents the settings used to connect to a LDAP server
|
|
LDAPSettings struct {
|
|
AnonymousMode bool `json:"AnonymousMode"`
|
|
ReaderDN string `json:"ReaderDN"`
|
|
Password string `json:"Password,omitempty"`
|
|
URL string `json:"URL"`
|
|
TLSConfig TLSConfiguration `json:"TLSConfig"`
|
|
StartTLS bool `json:"StartTLS"`
|
|
SearchSettings []LDAPSearchSettings `json:"SearchSettings"`
|
|
GroupSearchSettings []LDAPGroupSearchSettings `json:"GroupSearchSettings"`
|
|
AutoCreateUsers bool `json:"AutoCreateUsers"`
|
|
}
|
|
|
|
// LicenseInformation represents information about an extension license
|
|
LicenseInformation struct {
|
|
LicenseKey string `json:"LicenseKey,omitempty"`
|
|
Company string `json:"Company,omitempty"`
|
|
Expiration string `json:"Expiration,omitempty"`
|
|
Valid bool `json:"Valid,omitempty"`
|
|
}
|
|
|
|
// MembershipRole represents the role of a user within a team
|
|
MembershipRole int
|
|
|
|
// OAuthSettings represents the settings used to authorize with an authorization server
|
|
OAuthSettings struct {
|
|
ClientID string `json:"ClientID"`
|
|
ClientSecret string `json:"ClientSecret,omitempty"`
|
|
AccessTokenURI string `json:"AccessTokenURI"`
|
|
AuthorizationURI string `json:"AuthorizationURI"`
|
|
ResourceURI string `json:"ResourceURI"`
|
|
RedirectURI string `json:"RedirectURI"`
|
|
UserIdentifier string `json:"UserIdentifier"`
|
|
Scopes string `json:"Scopes"`
|
|
OAuthAutoCreateUsers bool `json:"OAuthAutoCreateUsers"`
|
|
DefaultTeamID TeamID `json:"DefaultTeamID"`
|
|
}
|
|
|
|
// Pair defines a key/value string pair
|
|
Pair struct {
|
|
Name string `json:"name"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
// Registry represents a Docker registry with all the info required
|
|
// to connect to it
|
|
Registry struct {
|
|
ID RegistryID `json:"Id"`
|
|
Type RegistryType `json:"Type"`
|
|
Name string `json:"Name"`
|
|
URL string `json:"URL"`
|
|
Authentication bool `json:"Authentication"`
|
|
Username string `json:"Username"`
|
|
Password string `json:"Password,omitempty"`
|
|
ManagementConfiguration *RegistryManagementConfiguration `json:"ManagementConfiguration"`
|
|
Gitlab GitlabRegistryData `json:"Gitlab"`
|
|
UserAccessPolicies UserAccessPolicies `json:"UserAccessPolicies"`
|
|
TeamAccessPolicies TeamAccessPolicies `json:"TeamAccessPolicies"`
|
|
|
|
// Deprecated fields
|
|
// Deprecated in DBVersion == 18
|
|
AuthorizedUsers []UserID `json:"AuthorizedUsers"`
|
|
AuthorizedTeams []TeamID `json:"AuthorizedTeams"`
|
|
}
|
|
|
|
// RegistryID represents a registry identifier
|
|
RegistryID int
|
|
|
|
// RegistryManagementConfiguration represents a configuration that can be used to query
|
|
// the registry API via the registry management extension.
|
|
RegistryManagementConfiguration struct {
|
|
Type RegistryType `json:"Type"`
|
|
Authentication bool `json:"Authentication"`
|
|
Username string `json:"Username"`
|
|
Password string `json:"Password"`
|
|
TLSConfig TLSConfiguration `json:"TLSConfig"`
|
|
}
|
|
|
|
// RegistryType represents a type of registry
|
|
RegistryType int
|
|
|
|
// ResourceAccessLevel represents the level of control associated to a resource
|
|
ResourceAccessLevel int
|
|
|
|
// ResourceControl represent a reference to a Docker resource with specific access controls
|
|
ResourceControl struct {
|
|
ID ResourceControlID `json:"Id"`
|
|
ResourceID string `json:"ResourceId"`
|
|
SubResourceIDs []string `json:"SubResourceIds"`
|
|
Type ResourceControlType `json:"Type"`
|
|
UserAccesses []UserResourceAccess `json:"UserAccesses"`
|
|
TeamAccesses []TeamResourceAccess `json:"TeamAccesses"`
|
|
Public bool `json:"Public"`
|
|
AdministratorsOnly bool `json:"AdministratorsOnly"`
|
|
System bool `json:"System"`
|
|
|
|
// Deprecated fields
|
|
// Deprecated in DBVersion == 2
|
|
OwnerID UserID `json:"OwnerId,omitempty"`
|
|
AccessLevel ResourceAccessLevel `json:"AccessLevel,omitempty"`
|
|
}
|
|
|
|
// ResourceControlID represents a resource control identifier
|
|
ResourceControlID int
|
|
|
|
// ResourceControlType represents the type of resource associated to the resource control (volume, container, service...)
|
|
ResourceControlType int
|
|
|
|
// Role represents a set of authorizations that can be associated to a user or
|
|
// to a team.
|
|
Role struct {
|
|
ID RoleID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
Description string `json:"Description"`
|
|
Authorizations Authorizations `json:"Authorizations"`
|
|
Priority int `json:"Priority"`
|
|
}
|
|
|
|
// RoleID represents a role identifier
|
|
RoleID int
|
|
|
|
// Schedule represents a scheduled job.
|
|
// It only contains a pointer to one of the JobRunner implementations
|
|
// based on the JobType.
|
|
// NOTE: The Recurring option is only used by ScriptExecutionJob at the moment
|
|
Schedule struct {
|
|
ID ScheduleID `json:"Id"`
|
|
Name string
|
|
CronExpression string
|
|
Recurring bool
|
|
Created int64
|
|
JobType JobType
|
|
EdgeSchedule *EdgeSchedule
|
|
ScriptExecutionJob *ScriptExecutionJob
|
|
SnapshotJob *SnapshotJob
|
|
EndpointSyncJob *EndpointSyncJob
|
|
}
|
|
|
|
// ScheduleID represents a schedule identifier.
|
|
ScheduleID int
|
|
|
|
// ScriptExecutionJob represents a scheduled job that can execute a script via a privileged container
|
|
ScriptExecutionJob struct {
|
|
Endpoints []EndpointID
|
|
Image string
|
|
ScriptPath string
|
|
RetryCount int
|
|
RetryInterval int
|
|
}
|
|
|
|
// Settings represents the application settings
|
|
Settings struct {
|
|
LogoURL string `json:"LogoURL"`
|
|
BlackListedLabels []Pair `json:"BlackListedLabels"`
|
|
AuthenticationMethod AuthenticationMethod `json:"AuthenticationMethod"`
|
|
LDAPSettings LDAPSettings `json:"LDAPSettings"`
|
|
OAuthSettings OAuthSettings `json:"OAuthSettings"`
|
|
AllowBindMountsForRegularUsers bool `json:"AllowBindMountsForRegularUsers"`
|
|
AllowPrivilegedModeForRegularUsers bool `json:"AllowPrivilegedModeForRegularUsers"`
|
|
AllowVolumeBrowserForRegularUsers bool `json:"AllowVolumeBrowserForRegularUsers"`
|
|
SnapshotInterval string `json:"SnapshotInterval"`
|
|
TemplatesURL string `json:"TemplatesURL"`
|
|
EnableHostManagementFeatures bool `json:"EnableHostManagementFeatures"`
|
|
EdgeAgentCheckinInterval int `json:"EdgeAgentCheckinInterval"`
|
|
EnableEdgeComputeFeatures bool `json:"EnableEdgeComputeFeatures"`
|
|
|
|
// Deprecated fields
|
|
DisplayDonationHeader bool
|
|
DisplayExternalContributors bool
|
|
}
|
|
|
|
// Snapshot represents a snapshot of a specific endpoint at a specific time
|
|
Snapshot struct {
|
|
Time int64 `json:"Time"`
|
|
DockerVersion string `json:"DockerVersion"`
|
|
Swarm bool `json:"Swarm"`
|
|
TotalCPU int `json:"TotalCPU"`
|
|
TotalMemory int64 `json:"TotalMemory"`
|
|
RunningContainerCount int `json:"RunningContainerCount"`
|
|
StoppedContainerCount int `json:"StoppedContainerCount"`
|
|
HealthyContainerCount int `json:"HealthyContainerCount"`
|
|
UnhealthyContainerCount int `json:"UnhealthyContainerCount"`
|
|
VolumeCount int `json:"VolumeCount"`
|
|
ImageCount int `json:"ImageCount"`
|
|
ServiceCount int `json:"ServiceCount"`
|
|
StackCount int `json:"StackCount"`
|
|
SnapshotRaw SnapshotRaw `json:"SnapshotRaw"`
|
|
}
|
|
|
|
// SnapshotJob represents a scheduled job that can create endpoint snapshots
|
|
SnapshotJob struct{}
|
|
|
|
// SnapshotRaw represents all the information related to a snapshot as returned by the Docker API
|
|
SnapshotRaw struct {
|
|
Containers interface{} `json:"Containers"`
|
|
Volumes interface{} `json:"Volumes"`
|
|
Networks interface{} `json:"Networks"`
|
|
Images interface{} `json:"Images"`
|
|
Info interface{} `json:"Info"`
|
|
Version interface{} `json:"Version"`
|
|
}
|
|
|
|
// Stack represents a Docker stack created via docker stack deploy
|
|
Stack struct {
|
|
ID StackID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
Type StackType `json:"Type"`
|
|
EndpointID EndpointID `json:"EndpointId"`
|
|
SwarmID string `json:"SwarmId"`
|
|
EntryPoint string `json:"EntryPoint"`
|
|
Env []Pair `json:"Env"`
|
|
ResourceControl *ResourceControl `json:"ResourceControl"`
|
|
ProjectPath string
|
|
}
|
|
|
|
// StackID represents a stack identifier (it must be composed of Name + "_" + SwarmID to create a unique identifier)
|
|
StackID int
|
|
|
|
// StackType represents the type of the stack (compose v2, stack deploy v3)
|
|
StackType int
|
|
|
|
// Status represents the application status
|
|
Status struct {
|
|
Authentication bool `json:"Authentication"`
|
|
EndpointManagement bool `json:"EndpointManagement"`
|
|
Snapshot bool `json:"Snapshot"`
|
|
Analytics bool `json:"Analytics"`
|
|
Version string `json:"Version"`
|
|
}
|
|
|
|
// Tag represents a tag that can be associated to a resource
|
|
Tag struct {
|
|
ID TagID
|
|
Name string `json:"Name"`
|
|
Endpoints map[EndpointID]bool `json:"Endpoints"`
|
|
EndpointGroups map[EndpointGroupID]bool `json:"EndpointGroups"`
|
|
}
|
|
|
|
// TagID represents a tag identifier
|
|
TagID int
|
|
|
|
// Team represents a list of user accounts
|
|
Team struct {
|
|
ID TeamID `json:"Id"`
|
|
Name string `json:"Name"`
|
|
}
|
|
|
|
// TeamAccessPolicies represent the association of an access policy and a team
|
|
TeamAccessPolicies map[TeamID]AccessPolicy
|
|
|
|
// TeamID represents a team identifier
|
|
TeamID int
|
|
|
|
// TeamMembership represents a membership association between a user and a team
|
|
TeamMembership struct {
|
|
ID TeamMembershipID `json:"Id"`
|
|
UserID UserID `json:"UserID"`
|
|
TeamID TeamID `json:"TeamID"`
|
|
Role MembershipRole `json:"Role"`
|
|
}
|
|
|
|
// TeamMembershipID represents a team membership identifier
|
|
TeamMembershipID int
|
|
|
|
// TeamResourceAccess represents the level of control on a resource for a specific team
|
|
TeamResourceAccess struct {
|
|
TeamID TeamID `json:"TeamId"`
|
|
AccessLevel ResourceAccessLevel `json:"AccessLevel"`
|
|
}
|
|
|
|
// Template represents an application template
|
|
Template struct {
|
|
// Mandatory container/stack fields
|
|
ID TemplateID `json:"Id"`
|
|
Type TemplateType `json:"type"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
AdministratorOnly bool `json:"administrator_only"`
|
|
|
|
// Mandatory container fields
|
|
Image string `json:"image"`
|
|
|
|
// Mandatory stack fields
|
|
Repository TemplateRepository `json:"repository"`
|
|
|
|
// Mandatory edge stack fields
|
|
StackFile string `json:"stackFile"`
|
|
|
|
// Optional stack/container fields
|
|
Name string `json:"name,omitempty"`
|
|
Logo string `json:"logo,omitempty"`
|
|
Env []TemplateEnv `json:"env,omitempty"`
|
|
Note string `json:"note,omitempty"`
|
|
Platform string `json:"platform,omitempty"`
|
|
Categories []string `json:"categories,omitempty"`
|
|
|
|
// Optional container fields
|
|
Registry string `json:"registry,omitempty"`
|
|
Command string `json:"command,omitempty"`
|
|
Network string `json:"network,omitempty"`
|
|
Volumes []TemplateVolume `json:"volumes,omitempty"`
|
|
Ports []string `json:"ports,omitempty"`
|
|
Labels []Pair `json:"labels,omitempty"`
|
|
Privileged bool `json:"privileged,omitempty"`
|
|
Interactive bool `json:"interactive,omitempty"`
|
|
RestartPolicy string `json:"restart_policy,omitempty"`
|
|
Hostname string `json:"hostname,omitempty"`
|
|
}
|
|
|
|
// TemplateEnv represents a template environment variable configuration
|
|
TemplateEnv struct {
|
|
Name string `json:"name"`
|
|
Label string `json:"label,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
Default string `json:"default,omitempty"`
|
|
Preset bool `json:"preset,omitempty"`
|
|
Select []TemplateEnvSelect `json:"select,omitempty"`
|
|
}
|
|
|
|
// TemplateEnvSelect represents text/value pair that will be displayed as a choice for the
|
|
// template user
|
|
TemplateEnvSelect struct {
|
|
Text string `json:"text"`
|
|
Value string `json:"value"`
|
|
Default bool `json:"default"`
|
|
}
|
|
|
|
// TemplateID represents a template identifier
|
|
TemplateID int
|
|
|
|
// TemplateRepository represents the git repository configuration for a template
|
|
TemplateRepository struct {
|
|
URL string `json:"url"`
|
|
StackFile string `json:"stackfile"`
|
|
}
|
|
|
|
// TemplateType represents the type of a template
|
|
TemplateType int
|
|
|
|
// TemplateVolume represents a template volume configuration
|
|
TemplateVolume struct {
|
|
Container string `json:"container"`
|
|
Bind string `json:"bind,omitempty"`
|
|
ReadOnly bool `json:"readonly,omitempty"`
|
|
}
|
|
|
|
// TLSConfiguration represents a TLS configuration
|
|
TLSConfiguration struct {
|
|
TLS bool `json:"TLS"`
|
|
TLSSkipVerify bool `json:"TLSSkipVerify"`
|
|
TLSCACertPath string `json:"TLSCACert,omitempty"`
|
|
TLSCertPath string `json:"TLSCert,omitempty"`
|
|
TLSKeyPath string `json:"TLSKey,omitempty"`
|
|
}
|
|
|
|
// TLSFileType represents a type of TLS file required to connect to a Docker endpoint.
|
|
// It can be either a TLS CA file, a TLS certificate file or a TLS key file
|
|
TLSFileType int
|
|
|
|
// TokenData represents the data embedded in a JWT token
|
|
TokenData struct {
|
|
ID UserID
|
|
Username string
|
|
Role UserRole
|
|
}
|
|
|
|
// TunnelDetails represents information associated to a tunnel
|
|
TunnelDetails struct {
|
|
Status string
|
|
LastActivity time.Time
|
|
Port int
|
|
Schedules []EdgeSchedule
|
|
Credentials string
|
|
}
|
|
|
|
// TunnelServerInfo represents information associated to the tunnel server
|
|
TunnelServerInfo struct {
|
|
PrivateKeySeed string `json:"PrivateKeySeed"`
|
|
}
|
|
|
|
// User represents a user account
|
|
User struct {
|
|
ID UserID `json:"Id"`
|
|
Username string `json:"Username"`
|
|
Password string `json:"Password,omitempty"`
|
|
Role UserRole `json:"Role"`
|
|
PortainerAuthorizations Authorizations `json:"PortainerAuthorizations"`
|
|
EndpointAuthorizations EndpointAuthorizations `json:"EndpointAuthorizations"`
|
|
}
|
|
|
|
// UserAccessPolicies represent the association of an access policy and a user
|
|
UserAccessPolicies map[UserID]AccessPolicy
|
|
|
|
// UserID represents a user identifier
|
|
UserID int
|
|
|
|
// UserResourceAccess represents the level of control on a resource for a specific user
|
|
UserResourceAccess struct {
|
|
UserID UserID `json:"UserId"`
|
|
AccessLevel ResourceAccessLevel `json:"AccessLevel"`
|
|
}
|
|
|
|
// UserRole represents the role of a user. It can be either an administrator
|
|
// or a regular user
|
|
UserRole int
|
|
|
|
// Webhook represents a url webhook that can be used to update a service
|
|
Webhook struct {
|
|
ID WebhookID `json:"Id"`
|
|
Token string `json:"Token"`
|
|
ResourceID string `json:"ResourceId"`
|
|
EndpointID EndpointID `json:"EndpointId"`
|
|
WebhookType WebhookType `json:"Type"`
|
|
}
|
|
|
|
// WebhookID represents a webhook identifier.
|
|
WebhookID int
|
|
|
|
// WebhookType represents the type of resource a webhook is related to
|
|
WebhookType int
|
|
|
|
// ComposeStackManager represents a service to manage Compose stacks
|
|
ComposeStackManager interface {
|
|
Up(stack *Stack, endpoint *Endpoint) error
|
|
Down(stack *Stack, endpoint *Endpoint) error
|
|
}
|
|
|
|
// CryptoService represents a service for encrypting/hashing data
|
|
CryptoService interface {
|
|
Hash(data string) (string, error)
|
|
CompareHashAndData(hash string, data string) error
|
|
}
|
|
|
|
// DigitalSignatureService represents a service to manage digital signatures
|
|
DigitalSignatureService interface {
|
|
ParseKeyPair(private, public []byte) error
|
|
GenerateKeyPair() ([]byte, []byte, error)
|
|
EncodedPublicKey() string
|
|
PEMHeaders() (string, string)
|
|
CreateSignature(message string) (string, error)
|
|
}
|
|
|
|
// DockerHubService represents a service for managing the DockerHub object
|
|
DockerHubService interface {
|
|
DockerHub() (*DockerHub, error)
|
|
UpdateDockerHub(registry *DockerHub) error
|
|
}
|
|
|
|
// EndpointService represents a service for managing endpoint data
|
|
EndpointService interface {
|
|
Endpoint(ID EndpointID) (*Endpoint, error)
|
|
Endpoints() ([]Endpoint, error)
|
|
CreateEndpoint(endpoint *Endpoint) error
|
|
UpdateEndpoint(ID EndpointID, endpoint *Endpoint) error
|
|
DeleteEndpoint(ID EndpointID) error
|
|
Synchronize(toCreate, toUpdate, toDelete []*Endpoint) error
|
|
GetNextIdentifier() int
|
|
}
|
|
|
|
// EndpointGroupService represents a service for managing endpoint group data
|
|
EndpointGroupService interface {
|
|
EndpointGroup(ID EndpointGroupID) (*EndpointGroup, error)
|
|
EndpointGroups() ([]EndpointGroup, error)
|
|
CreateEndpointGroup(group *EndpointGroup) error
|
|
UpdateEndpointGroup(ID EndpointGroupID, group *EndpointGroup) error
|
|
DeleteEndpointGroup(ID EndpointGroupID) error
|
|
}
|
|
|
|
// EndpointRelationService represents a service for managing endpoint relations data
|
|
EndpointRelationService interface {
|
|
EndpointRelation(EndpointID EndpointID) (*EndpointRelation, error)
|
|
CreateEndpointRelation(endpointRelation *EndpointRelation) error
|
|
UpdateEndpointRelation(EndpointID EndpointID, endpointRelation *EndpointRelation) error
|
|
DeleteEndpointRelation(EndpointID EndpointID) error
|
|
}
|
|
|
|
// ExtensionManager represents a service used to manage extensions
|
|
ExtensionManager interface {
|
|
FetchExtensionDefinitions() ([]Extension, error)
|
|
InstallExtension(extension *Extension, licenseKey string, archiveFileName string, extensionArchive []byte) error
|
|
EnableExtension(extension *Extension, licenseKey string) error
|
|
DisableExtension(extension *Extension) error
|
|
UpdateExtension(extension *Extension, version string) error
|
|
StartExtensions() error
|
|
}
|
|
|
|
// ExtensionService represents a service for managing extension data
|
|
ExtensionService interface {
|
|
Extension(ID ExtensionID) (*Extension, error)
|
|
Extensions() ([]Extension, error)
|
|
Persist(extension *Extension) error
|
|
DeleteExtension(ID ExtensionID) error
|
|
}
|
|
|
|
// FileService represents a service for managing files
|
|
FileService interface {
|
|
GetFileContent(filePath string) ([]byte, error)
|
|
Rename(oldPath, newPath string) error
|
|
RemoveDirectory(directoryPath string) error
|
|
StoreTLSFileFromBytes(folder string, fileType TLSFileType, data []byte) (string, error)
|
|
GetPathForTLSFile(folder string, fileType TLSFileType) (string, error)
|
|
DeleteTLSFile(folder string, fileType TLSFileType) error
|
|
DeleteTLSFiles(folder string) error
|
|
GetStackProjectPath(stackIdentifier string) string
|
|
StoreStackFileFromBytes(stackIdentifier, fileName string, data []byte) (string, error)
|
|
GetEdgeStackProjectPath(edgeStackIdentifier string) string
|
|
StoreEdgeStackFileFromBytes(edgeStackIdentifier, fileName string, data []byte) (string, error)
|
|
StoreRegistryManagementFileFromBytes(folder, fileName string, data []byte) (string, error)
|
|
KeyPairFilesExist() (bool, error)
|
|
StoreKeyPair(private, public []byte, privatePEMHeader, publicPEMHeader string) error
|
|
LoadKeyPair() ([]byte, []byte, error)
|
|
WriteJSONToFile(path string, content interface{}) error
|
|
FileExists(path string) (bool, error)
|
|
StoreScheduledJobFileFromBytes(identifier string, data []byte) (string, error)
|
|
GetScheduleFolder(identifier string) string
|
|
ExtractExtensionArchive(data []byte) error
|
|
GetBinaryFolder() string
|
|
}
|
|
|
|
// GitService represents a service for managing Git
|
|
GitService interface {
|
|
ClonePublicRepository(repositoryURL, referenceName string, destination string) error
|
|
ClonePrivateRepositoryWithBasicAuth(repositoryURL, referenceName string, destination, username, password string) error
|
|
}
|
|
|
|
// JobRunner represents a service that can be used to run a job
|
|
JobRunner interface {
|
|
Run()
|
|
GetSchedule() *Schedule
|
|
}
|
|
|
|
// JobScheduler represents a service to run jobs on a periodic basis
|
|
JobScheduler interface {
|
|
ScheduleJob(runner JobRunner) error
|
|
UpdateJobSchedule(runner JobRunner) error
|
|
UpdateSystemJobSchedule(jobType JobType, newCronExpression string) error
|
|
UnscheduleJob(ID ScheduleID)
|
|
Start()
|
|
}
|
|
|
|
// JobService represents a service to manage job execution on hosts
|
|
JobService interface {
|
|
ExecuteScript(endpoint *Endpoint, nodeName, image string, script []byte, schedule *Schedule) error
|
|
}
|
|
|
|
// JWTService represents a service for managing JWT tokens
|
|
JWTService interface {
|
|
GenerateToken(data *TokenData) (string, error)
|
|
ParseAndVerifyToken(token string) (*TokenData, error)
|
|
}
|
|
|
|
// LDAPService represents a service used to authenticate users against a LDAP/AD
|
|
LDAPService interface {
|
|
AuthenticateUser(username, password string, settings *LDAPSettings) error
|
|
TestConnectivity(settings *LDAPSettings) error
|
|
GetUserGroups(username string, settings *LDAPSettings) ([]string, error)
|
|
}
|
|
|
|
// RegistryService represents a service for managing registry data
|
|
RegistryService interface {
|
|
Registry(ID RegistryID) (*Registry, error)
|
|
Registries() ([]Registry, error)
|
|
CreateRegistry(registry *Registry) error
|
|
UpdateRegistry(ID RegistryID, registry *Registry) error
|
|
DeleteRegistry(ID RegistryID) error
|
|
}
|
|
|
|
// ResourceControlService represents a service for managing resource control data
|
|
ResourceControlService interface {
|
|
ResourceControl(ID ResourceControlID) (*ResourceControl, error)
|
|
ResourceControlByResourceIDAndType(resourceID string, resourceType ResourceControlType) (*ResourceControl, error)
|
|
ResourceControls() ([]ResourceControl, error)
|
|
CreateResourceControl(rc *ResourceControl) error
|
|
UpdateResourceControl(ID ResourceControlID, resourceControl *ResourceControl) error
|
|
DeleteResourceControl(ID ResourceControlID) error
|
|
}
|
|
|
|
// ReverseTunnelService represensts a service used to manage reverse tunnel connections.
|
|
ReverseTunnelService interface {
|
|
StartTunnelServer(addr, port string, snapshotter Snapshotter) error
|
|
GenerateEdgeKey(url, host string, endpointIdentifier int) string
|
|
SetTunnelStatusToActive(endpointID EndpointID)
|
|
SetTunnelStatusToRequired(endpointID EndpointID) error
|
|
SetTunnelStatusToIdle(endpointID EndpointID)
|
|
GetTunnelDetails(endpointID EndpointID) *TunnelDetails
|
|
AddSchedule(endpointID EndpointID, schedule *EdgeSchedule)
|
|
RemoveSchedule(scheduleID ScheduleID)
|
|
}
|
|
|
|
// RoleService represents a service for managing user roles
|
|
RoleService interface {
|
|
Role(ID RoleID) (*Role, error)
|
|
Roles() ([]Role, error)
|
|
CreateRole(role *Role) error
|
|
UpdateRole(ID RoleID, role *Role) error
|
|
}
|
|
|
|
// ScheduleService represents a service for managing schedule data
|
|
ScheduleService interface {
|
|
Schedule(ID ScheduleID) (*Schedule, error)
|
|
Schedules() ([]Schedule, error)
|
|
SchedulesByJobType(jobType JobType) ([]Schedule, error)
|
|
CreateSchedule(schedule *Schedule) error
|
|
UpdateSchedule(ID ScheduleID, schedule *Schedule) error
|
|
DeleteSchedule(ID ScheduleID) error
|
|
GetNextIdentifier() int
|
|
}
|
|
|
|
// SettingsService represents a service for managing application settings
|
|
SettingsService interface {
|
|
Settings() (*Settings, error)
|
|
UpdateSettings(settings *Settings) error
|
|
}
|
|
|
|
// Server defines the interface to serve the API
|
|
Server interface {
|
|
Start() error
|
|
}
|
|
|
|
// Snapshotter represents a service used to create endpoint snapshots
|
|
Snapshotter interface {
|
|
CreateSnapshot(endpoint *Endpoint) (*Snapshot, error)
|
|
}
|
|
|
|
// StackService represents a service for managing stack data
|
|
StackService interface {
|
|
Stack(ID StackID) (*Stack, error)
|
|
StackByName(name string) (*Stack, error)
|
|
Stacks() ([]Stack, error)
|
|
CreateStack(stack *Stack) error
|
|
UpdateStack(ID StackID, stack *Stack) error
|
|
DeleteStack(ID StackID) error
|
|
GetNextIdentifier() int
|
|
}
|
|
|
|
// SwarmStackManager represents a service to manage Swarm stacks
|
|
SwarmStackManager interface {
|
|
Login(dockerhub *DockerHub, registries []Registry, endpoint *Endpoint)
|
|
Logout(endpoint *Endpoint) error
|
|
Deploy(stack *Stack, prune bool, endpoint *Endpoint) error
|
|
Remove(stack *Stack, endpoint *Endpoint) error
|
|
}
|
|
|
|
// TagService represents a service for managing tag data
|
|
TagService interface {
|
|
Tags() ([]Tag, error)
|
|
Tag(ID TagID) (*Tag, error)
|
|
CreateTag(tag *Tag) error
|
|
UpdateTag(ID TagID, tag *Tag) error
|
|
DeleteTag(ID TagID) error
|
|
}
|
|
|
|
// TeamService represents a service for managing user data
|
|
TeamService interface {
|
|
Team(ID TeamID) (*Team, error)
|
|
TeamByName(name string) (*Team, error)
|
|
Teams() ([]Team, error)
|
|
CreateTeam(team *Team) error
|
|
UpdateTeam(ID TeamID, team *Team) error
|
|
DeleteTeam(ID TeamID) error
|
|
}
|
|
|
|
// TeamMembershipService represents a service for managing team membership data
|
|
TeamMembershipService interface {
|
|
TeamMembership(ID TeamMembershipID) (*TeamMembership, error)
|
|
TeamMemberships() ([]TeamMembership, error)
|
|
TeamMembershipsByUserID(userID UserID) ([]TeamMembership, error)
|
|
TeamMembershipsByTeamID(teamID TeamID) ([]TeamMembership, error)
|
|
CreateTeamMembership(membership *TeamMembership) error
|
|
UpdateTeamMembership(ID TeamMembershipID, membership *TeamMembership) error
|
|
DeleteTeamMembership(ID TeamMembershipID) error
|
|
DeleteTeamMembershipByUserID(userID UserID) error
|
|
DeleteTeamMembershipByTeamID(teamID TeamID) error
|
|
}
|
|
|
|
// TemplateService represents a service for managing template data
|
|
TemplateService interface {
|
|
Templates() ([]Template, error)
|
|
Template(ID TemplateID) (*Template, error)
|
|
CreateTemplate(template *Template) error
|
|
UpdateTemplate(ID TemplateID, template *Template) error
|
|
DeleteTemplate(ID TemplateID) error
|
|
}
|
|
|
|
// TunnelServerService represents a service for managing data associated to the tunnel server
|
|
TunnelServerService interface {
|
|
Info() (*TunnelServerInfo, error)
|
|
UpdateInfo(info *TunnelServerInfo) error
|
|
}
|
|
|
|
// UserService represents a service for managing user data
|
|
UserService interface {
|
|
User(ID UserID) (*User, error)
|
|
UserByUsername(username string) (*User, error)
|
|
Users() ([]User, error)
|
|
UsersByRole(role UserRole) ([]User, error)
|
|
CreateUser(user *User) error
|
|
UpdateUser(ID UserID, user *User) error
|
|
DeleteUser(ID UserID) error
|
|
}
|
|
|
|
// VersionService represents a service for managing version data
|
|
VersionService interface {
|
|
DBVersion() (int, error)
|
|
StoreDBVersion(version int) error
|
|
}
|
|
|
|
// WebhookService represents a service for managing webhook data.
|
|
WebhookService interface {
|
|
Webhooks() ([]Webhook, error)
|
|
Webhook(ID WebhookID) (*Webhook, error)
|
|
CreateWebhook(portainer *Webhook) error
|
|
WebhookByResourceID(resourceID string) (*Webhook, error)
|
|
WebhookByToken(token string) (*Webhook, error)
|
|
DeleteWebhook(serviceID WebhookID) error
|
|
}
|
|
|
|
// EdgeGroupService represents a service to manage Edge groups
|
|
EdgeGroupService interface {
|
|
EdgeGroups() ([]EdgeGroup, error)
|
|
EdgeGroup(ID EdgeGroupID) (*EdgeGroup, error)
|
|
CreateEdgeGroup(group *EdgeGroup) error
|
|
UpdateEdgeGroup(ID EdgeGroupID, group *EdgeGroup) error
|
|
DeleteEdgeGroup(ID EdgeGroupID) error
|
|
}
|
|
|
|
// EdgeStackService represents a service to manage Edge stacks
|
|
EdgeStackService interface {
|
|
EdgeStacks() ([]EdgeStack, error)
|
|
EdgeStack(ID EdgeStackID) (*EdgeStack, error)
|
|
CreateEdgeStack(edgeStack *EdgeStack) error
|
|
UpdateEdgeStack(ID EdgeStackID, edgeStack *EdgeStack) error
|
|
DeleteEdgeStack(ID EdgeStackID) error
|
|
GetNextIdentifier() int
|
|
}
|
|
)
|
|
|
|
const (
|
|
// APIVersion is the version number of the Portainer API
|
|
APIVersion = "1.24.0-dev"
|
|
// DBVersion is the version number of the Portainer database
|
|
DBVersion = 23
|
|
// AssetsServerURL represents the URL of the Portainer asset server
|
|
AssetsServerURL = "https://portainer-io-assets.sfo2.digitaloceanspaces.com"
|
|
// MessageOfTheDayURL represents the URL where Portainer MOTD message can be retrieved
|
|
MessageOfTheDayURL = AssetsServerURL + "/motd.json"
|
|
// VersionCheckURL represents the URL used to retrieve the latest version of Portainer
|
|
VersionCheckURL = "https://api.github.com/repos/portainer/portainer/releases/latest"
|
|
// ExtensionDefinitionsURL represents the URL where Portainer extension definitions can be retrieved
|
|
ExtensionDefinitionsURL = AssetsServerURL + "/extensions-" + APIVersion + ".json"
|
|
// SupportProductsURL represents the URL where Portainer support products can be retrieved
|
|
SupportProductsURL = AssetsServerURL + "/support.json"
|
|
// PortainerAgentHeader represents the name of the header available in any agent response
|
|
PortainerAgentHeader = "Portainer-Agent"
|
|
// PortainerAgentEdgeIDHeader represent the name of the header containing the Edge ID associated to an agent/agent cluster
|
|
PortainerAgentEdgeIDHeader = "X-PortainerAgent-EdgeID"
|
|
// PortainerAgentTargetHeader represent the name of the header containing the target node name
|
|
PortainerAgentTargetHeader = "X-PortainerAgent-Target"
|
|
// PortainerAgentSignatureHeader represent the name of the header containing the digital signature
|
|
PortainerAgentSignatureHeader = "X-PortainerAgent-Signature"
|
|
// PortainerAgentPublicKeyHeader represent the name of the header containing the public key
|
|
PortainerAgentPublicKeyHeader = "X-PortainerAgent-PublicKey"
|
|
// PortainerAgentSignatureMessage represents the message used to create a digital signature
|
|
// to be used when communicating with an agent
|
|
PortainerAgentSignatureMessage = "Portainer-App"
|
|
// ExtensionServer represents the server used by Portainer to communicate with extensions
|
|
ExtensionServer = "127.0.0.1"
|
|
// DefaultEdgeAgentCheckinIntervalInSeconds represents the default interval (in seconds) used by Edge agents to checkin with the Portainer instance
|
|
DefaultEdgeAgentCheckinIntervalInSeconds = 5
|
|
// LocalExtensionManifestFile represents the name of the local manifest file for extensions
|
|
LocalExtensionManifestFile = "/extensions.json"
|
|
// EdgeTemplatesURL represents the URL used to retrieve Edge templates
|
|
EdgeTemplatesURL = "https://raw.githubusercontent.com/portainer/templates/master/templates-1.20.0.json"
|
|
)
|
|
|
|
const (
|
|
_ AuthenticationMethod = iota
|
|
// AuthenticationInternal represents the internal authentication method (authentication against Portainer API)
|
|
AuthenticationInternal
|
|
// AuthenticationLDAP represents the LDAP authentication method (authentication against a LDAP server)
|
|
AuthenticationLDAP
|
|
//AuthenticationOAuth represents the OAuth authentication method (authentication against a authorization server)
|
|
AuthenticationOAuth
|
|
)
|
|
|
|
const (
|
|
_ EdgeStackStatusType = iota
|
|
//StatusOk represents a successfully deployed edge stack
|
|
StatusOk
|
|
//StatusError represents an edge endpoint which failed to deploy its edge stack
|
|
StatusError
|
|
//StatusAcknowledged represents an acknowledged edge stack
|
|
StatusAcknowledged
|
|
)
|
|
|
|
const (
|
|
_ EndpointExtensionType = iota
|
|
// StoridgeEndpointExtension represents the Storidge extension
|
|
StoridgeEndpointExtension
|
|
)
|
|
|
|
const (
|
|
_ EndpointStatus = iota
|
|
// EndpointStatusUp is used to represent an available endpoint
|
|
EndpointStatusUp
|
|
// EndpointStatusDown is used to represent an unavailable endpoint
|
|
EndpointStatusDown
|
|
)
|
|
|
|
const (
|
|
_ EndpointType = iota
|
|
// DockerEnvironment represents an endpoint connected to a Docker environment
|
|
DockerEnvironment
|
|
// AgentOnDockerEnvironment represents an endpoint connected to a Portainer agent deployed on a Docker environment
|
|
AgentOnDockerEnvironment
|
|
// AzureEnvironment represents an endpoint connected to an Azure environment
|
|
AzureEnvironment
|
|
// EdgeAgentEnvironment represents an endpoint connected to an Edge agent
|
|
EdgeAgentEnvironment
|
|
)
|
|
|
|
const (
|
|
_ ExtensionID = iota
|
|
// RegistryManagementExtension represents the registry management extension
|
|
RegistryManagementExtension
|
|
// OAuthAuthenticationExtension represents the OAuth authentication extension
|
|
OAuthAuthenticationExtension
|
|
// RBACExtension represents the RBAC extension
|
|
RBACExtension
|
|
)
|
|
|
|
const (
|
|
_ JobType = iota
|
|
// ScriptExecutionJobType is a non-system job used to execute a script against a list of
|
|
// endpoints via privileged containers
|
|
ScriptExecutionJobType
|
|
// SnapshotJobType is a system job used to create endpoint snapshots
|
|
SnapshotJobType
|
|
// EndpointSyncJobType is a system job used to synchronize endpoints from
|
|
// an external definition store
|
|
EndpointSyncJobType
|
|
)
|
|
|
|
const (
|
|
_ MembershipRole = iota
|
|
// TeamLeader represents a leader role inside a team
|
|
TeamLeader
|
|
// TeamMember represents a member role inside a team
|
|
TeamMember
|
|
)
|
|
|
|
const (
|
|
_ RegistryType = iota
|
|
// QuayRegistry represents a Quay.io registry
|
|
QuayRegistry
|
|
// AzureRegistry represents an ACR registry
|
|
AzureRegistry
|
|
// CustomRegistry represents a custom registry
|
|
CustomRegistry
|
|
// GitlabRegistry represents a gitlab registry
|
|
GitlabRegistry
|
|
)
|
|
|
|
const (
|
|
_ ResourceAccessLevel = iota
|
|
// ReadWriteAccessLevel represents an access level with read-write permissions on a resource
|
|
ReadWriteAccessLevel
|
|
)
|
|
|
|
const (
|
|
_ ResourceControlType = iota
|
|
// ContainerResourceControl represents a resource control associated to a Docker container
|
|
ContainerResourceControl
|
|
// ServiceResourceControl represents a resource control associated to a Docker service
|
|
ServiceResourceControl
|
|
// VolumeResourceControl represents a resource control associated to a Docker volume
|
|
VolumeResourceControl
|
|
// NetworkResourceControl represents a resource control associated to a Docker network
|
|
NetworkResourceControl
|
|
// SecretResourceControl represents a resource control associated to a Docker secret
|
|
SecretResourceControl
|
|
// StackResourceControl represents a resource control associated to a stack composed of Docker services
|
|
StackResourceControl
|
|
// ConfigResourceControl represents a resource control associated to a Docker config
|
|
ConfigResourceControl
|
|
)
|
|
|
|
const (
|
|
_ StackType = iota
|
|
// DockerSwarmStack represents a stack managed via docker stack
|
|
DockerSwarmStack
|
|
// DockerComposeStack represents a stack managed via docker-compose
|
|
DockerComposeStack
|
|
)
|
|
|
|
const (
|
|
_ TemplateType = iota
|
|
// ContainerTemplate represents a container template
|
|
ContainerTemplate
|
|
// SwarmStackTemplate represents a template used to deploy a Swarm stack
|
|
SwarmStackTemplate
|
|
// ComposeStackTemplate represents a template used to deploy a Compose stack
|
|
ComposeStackTemplate
|
|
// EdgeStackTemplate represents a template used to deploy an Edge stack
|
|
EdgeStackTemplate
|
|
)
|
|
|
|
const (
|
|
// TLSFileCA represents a TLS CA certificate file
|
|
TLSFileCA TLSFileType = iota
|
|
// TLSFileCert represents a TLS certificate file
|
|
TLSFileCert
|
|
// TLSFileKey represents a TLS key file
|
|
TLSFileKey
|
|
)
|
|
|
|
const (
|
|
_ UserRole = iota
|
|
// AdministratorRole represents an administrator user role
|
|
AdministratorRole
|
|
// StandardUserRole represents a regular user role
|
|
StandardUserRole
|
|
)
|
|
|
|
const (
|
|
_ WebhookType = iota
|
|
// ServiceWebhook is a webhook for restarting a docker service
|
|
ServiceWebhook
|
|
)
|
|
|
|
const (
|
|
// EdgeAgentIdle represents an idle state for a tunnel connected to an Edge endpoint.
|
|
EdgeAgentIdle string = "IDLE"
|
|
// EdgeAgentManagementRequired represents a required state for a tunnel connected to an Edge endpoint
|
|
EdgeAgentManagementRequired string = "REQUIRED"
|
|
// EdgeAgentActive represents an active state for a tunnel connected to an Edge endpoint
|
|
EdgeAgentActive string = "ACTIVE"
|
|
)
|
|
|
|
const (
|
|
OperationDockerContainerArchiveInfo Authorization = "DockerContainerArchiveInfo"
|
|
OperationDockerContainerList Authorization = "DockerContainerList"
|
|
OperationDockerContainerExport Authorization = "DockerContainerExport"
|
|
OperationDockerContainerChanges Authorization = "DockerContainerChanges"
|
|
OperationDockerContainerInspect Authorization = "DockerContainerInspect"
|
|
OperationDockerContainerTop Authorization = "DockerContainerTop"
|
|
OperationDockerContainerLogs Authorization = "DockerContainerLogs"
|
|
OperationDockerContainerStats Authorization = "DockerContainerStats"
|
|
OperationDockerContainerAttachWebsocket Authorization = "DockerContainerAttachWebsocket"
|
|
OperationDockerContainerArchive Authorization = "DockerContainerArchive"
|
|
OperationDockerContainerCreate Authorization = "DockerContainerCreate"
|
|
OperationDockerContainerPrune Authorization = "DockerContainerPrune"
|
|
OperationDockerContainerKill Authorization = "DockerContainerKill"
|
|
OperationDockerContainerPause Authorization = "DockerContainerPause"
|
|
OperationDockerContainerUnpause Authorization = "DockerContainerUnpause"
|
|
OperationDockerContainerRestart Authorization = "DockerContainerRestart"
|
|
OperationDockerContainerStart Authorization = "DockerContainerStart"
|
|
OperationDockerContainerStop Authorization = "DockerContainerStop"
|
|
OperationDockerContainerWait Authorization = "DockerContainerWait"
|
|
OperationDockerContainerResize Authorization = "DockerContainerResize"
|
|
OperationDockerContainerAttach Authorization = "DockerContainerAttach"
|
|
OperationDockerContainerExec Authorization = "DockerContainerExec"
|
|
OperationDockerContainerRename Authorization = "DockerContainerRename"
|
|
OperationDockerContainerUpdate Authorization = "DockerContainerUpdate"
|
|
OperationDockerContainerPutContainerArchive Authorization = "DockerContainerPutContainerArchive"
|
|
OperationDockerContainerDelete Authorization = "DockerContainerDelete"
|
|
OperationDockerImageList Authorization = "DockerImageList"
|
|
OperationDockerImageSearch Authorization = "DockerImageSearch"
|
|
OperationDockerImageGetAll Authorization = "DockerImageGetAll"
|
|
OperationDockerImageGet Authorization = "DockerImageGet"
|
|
OperationDockerImageHistory Authorization = "DockerImageHistory"
|
|
OperationDockerImageInspect Authorization = "DockerImageInspect"
|
|
OperationDockerImageLoad Authorization = "DockerImageLoad"
|
|
OperationDockerImageCreate Authorization = "DockerImageCreate"
|
|
OperationDockerImagePrune Authorization = "DockerImagePrune"
|
|
OperationDockerImagePush Authorization = "DockerImagePush"
|
|
OperationDockerImageTag Authorization = "DockerImageTag"
|
|
OperationDockerImageDelete Authorization = "DockerImageDelete"
|
|
OperationDockerImageCommit Authorization = "DockerImageCommit"
|
|
OperationDockerImageBuild Authorization = "DockerImageBuild"
|
|
OperationDockerNetworkList Authorization = "DockerNetworkList"
|
|
OperationDockerNetworkInspect Authorization = "DockerNetworkInspect"
|
|
OperationDockerNetworkCreate Authorization = "DockerNetworkCreate"
|
|
OperationDockerNetworkConnect Authorization = "DockerNetworkConnect"
|
|
OperationDockerNetworkDisconnect Authorization = "DockerNetworkDisconnect"
|
|
OperationDockerNetworkPrune Authorization = "DockerNetworkPrune"
|
|
OperationDockerNetworkDelete Authorization = "DockerNetworkDelete"
|
|
OperationDockerVolumeList Authorization = "DockerVolumeList"
|
|
OperationDockerVolumeInspect Authorization = "DockerVolumeInspect"
|
|
OperationDockerVolumeCreate Authorization = "DockerVolumeCreate"
|
|
OperationDockerVolumePrune Authorization = "DockerVolumePrune"
|
|
OperationDockerVolumeDelete Authorization = "DockerVolumeDelete"
|
|
OperationDockerExecInspect Authorization = "DockerExecInspect"
|
|
OperationDockerExecStart Authorization = "DockerExecStart"
|
|
OperationDockerExecResize Authorization = "DockerExecResize"
|
|
OperationDockerSwarmInspect Authorization = "DockerSwarmInspect"
|
|
OperationDockerSwarmUnlockKey Authorization = "DockerSwarmUnlockKey"
|
|
OperationDockerSwarmInit Authorization = "DockerSwarmInit"
|
|
OperationDockerSwarmJoin Authorization = "DockerSwarmJoin"
|
|
OperationDockerSwarmLeave Authorization = "DockerSwarmLeave"
|
|
OperationDockerSwarmUpdate Authorization = "DockerSwarmUpdate"
|
|
OperationDockerSwarmUnlock Authorization = "DockerSwarmUnlock"
|
|
OperationDockerNodeList Authorization = "DockerNodeList"
|
|
OperationDockerNodeInspect Authorization = "DockerNodeInspect"
|
|
OperationDockerNodeUpdate Authorization = "DockerNodeUpdate"
|
|
OperationDockerNodeDelete Authorization = "DockerNodeDelete"
|
|
OperationDockerServiceList Authorization = "DockerServiceList"
|
|
OperationDockerServiceInspect Authorization = "DockerServiceInspect"
|
|
OperationDockerServiceLogs Authorization = "DockerServiceLogs"
|
|
OperationDockerServiceCreate Authorization = "DockerServiceCreate"
|
|
OperationDockerServiceUpdate Authorization = "DockerServiceUpdate"
|
|
OperationDockerServiceDelete Authorization = "DockerServiceDelete"
|
|
OperationDockerSecretList Authorization = "DockerSecretList"
|
|
OperationDockerSecretInspect Authorization = "DockerSecretInspect"
|
|
OperationDockerSecretCreate Authorization = "DockerSecretCreate"
|
|
OperationDockerSecretUpdate Authorization = "DockerSecretUpdate"
|
|
OperationDockerSecretDelete Authorization = "DockerSecretDelete"
|
|
OperationDockerConfigList Authorization = "DockerConfigList"
|
|
OperationDockerConfigInspect Authorization = "DockerConfigInspect"
|
|
OperationDockerConfigCreate Authorization = "DockerConfigCreate"
|
|
OperationDockerConfigUpdate Authorization = "DockerConfigUpdate"
|
|
OperationDockerConfigDelete Authorization = "DockerConfigDelete"
|
|
OperationDockerTaskList Authorization = "DockerTaskList"
|
|
OperationDockerTaskInspect Authorization = "DockerTaskInspect"
|
|
OperationDockerTaskLogs Authorization = "DockerTaskLogs"
|
|
OperationDockerPluginList Authorization = "DockerPluginList"
|
|
OperationDockerPluginPrivileges Authorization = "DockerPluginPrivileges"
|
|
OperationDockerPluginInspect Authorization = "DockerPluginInspect"
|
|
OperationDockerPluginPull Authorization = "DockerPluginPull"
|
|
OperationDockerPluginCreate Authorization = "DockerPluginCreate"
|
|
OperationDockerPluginEnable Authorization = "DockerPluginEnable"
|
|
OperationDockerPluginDisable Authorization = "DockerPluginDisable"
|
|
OperationDockerPluginPush Authorization = "DockerPluginPush"
|
|
OperationDockerPluginUpgrade Authorization = "DockerPluginUpgrade"
|
|
OperationDockerPluginSet Authorization = "DockerPluginSet"
|
|
OperationDockerPluginDelete Authorization = "DockerPluginDelete"
|
|
OperationDockerSessionStart Authorization = "DockerSessionStart"
|
|
OperationDockerDistributionInspect Authorization = "DockerDistributionInspect"
|
|
OperationDockerBuildPrune Authorization = "DockerBuildPrune"
|
|
OperationDockerBuildCancel Authorization = "DockerBuildCancel"
|
|
OperationDockerPing Authorization = "DockerPing"
|
|
OperationDockerInfo Authorization = "DockerInfo"
|
|
OperationDockerEvents Authorization = "DockerEvents"
|
|
OperationDockerSystem Authorization = "DockerSystem"
|
|
OperationDockerVersion Authorization = "DockerVersion"
|
|
|
|
OperationDockerAgentPing Authorization = "DockerAgentPing"
|
|
OperationDockerAgentList Authorization = "DockerAgentList"
|
|
OperationDockerAgentHostInfo Authorization = "DockerAgentHostInfo"
|
|
OperationDockerAgentBrowseDelete Authorization = "DockerAgentBrowseDelete"
|
|
OperationDockerAgentBrowseGet Authorization = "DockerAgentBrowseGet"
|
|
OperationDockerAgentBrowseList Authorization = "DockerAgentBrowseList"
|
|
OperationDockerAgentBrowsePut Authorization = "DockerAgentBrowsePut"
|
|
OperationDockerAgentBrowseRename Authorization = "DockerAgentBrowseRename"
|
|
|
|
OperationPortainerDockerHubInspect Authorization = "PortainerDockerHubInspect"
|
|
OperationPortainerDockerHubUpdate Authorization = "PortainerDockerHubUpdate"
|
|
OperationPortainerEndpointGroupCreate Authorization = "PortainerEndpointGroupCreate"
|
|
OperationPortainerEndpointGroupList Authorization = "PortainerEndpointGroupList"
|
|
OperationPortainerEndpointGroupDelete Authorization = "PortainerEndpointGroupDelete"
|
|
OperationPortainerEndpointGroupInspect Authorization = "PortainerEndpointGroupInspect"
|
|
OperationPortainerEndpointGroupUpdate Authorization = "PortainerEndpointGroupEdit"
|
|
OperationPortainerEndpointGroupAccess Authorization = "PortainerEndpointGroupAccess "
|
|
OperationPortainerEndpointList Authorization = "PortainerEndpointList"
|
|
OperationPortainerEndpointInspect Authorization = "PortainerEndpointInspect"
|
|
OperationPortainerEndpointCreate Authorization = "PortainerEndpointCreate"
|
|
OperationPortainerEndpointExtensionAdd Authorization = "PortainerEndpointExtensionAdd"
|
|
OperationPortainerEndpointJob Authorization = "PortainerEndpointJob"
|
|
OperationPortainerEndpointSnapshots Authorization = "PortainerEndpointSnapshots"
|
|
OperationPortainerEndpointSnapshot Authorization = "PortainerEndpointSnapshot"
|
|
OperationPortainerEndpointUpdate Authorization = "PortainerEndpointUpdate"
|
|
OperationPortainerEndpointUpdateAccess Authorization = "PortainerEndpointUpdateAccess"
|
|
OperationPortainerEndpointDelete Authorization = "PortainerEndpointDelete"
|
|
OperationPortainerEndpointExtensionRemove Authorization = "PortainerEndpointExtensionRemove"
|
|
OperationPortainerExtensionList Authorization = "PortainerExtensionList"
|
|
OperationPortainerExtensionInspect Authorization = "PortainerExtensionInspect"
|
|
OperationPortainerExtensionCreate Authorization = "PortainerExtensionCreate"
|
|
OperationPortainerExtensionUpdate Authorization = "PortainerExtensionUpdate"
|
|
OperationPortainerExtensionDelete Authorization = "PortainerExtensionDelete"
|
|
OperationPortainerMOTD Authorization = "PortainerMOTD"
|
|
OperationPortainerRegistryList Authorization = "PortainerRegistryList"
|
|
OperationPortainerRegistryInspect Authorization = "PortainerRegistryInspect"
|
|
OperationPortainerRegistryCreate Authorization = "PortainerRegistryCreate"
|
|
OperationPortainerRegistryConfigure Authorization = "PortainerRegistryConfigure"
|
|
OperationPortainerRegistryUpdate Authorization = "PortainerRegistryUpdate"
|
|
OperationPortainerRegistryUpdateAccess Authorization = "PortainerRegistryUpdateAccess"
|
|
OperationPortainerRegistryDelete Authorization = "PortainerRegistryDelete"
|
|
OperationPortainerResourceControlCreate Authorization = "PortainerResourceControlCreate"
|
|
OperationPortainerResourceControlUpdate Authorization = "PortainerResourceControlUpdate"
|
|
OperationPortainerResourceControlDelete Authorization = "PortainerResourceControlDelete"
|
|
OperationPortainerRoleList Authorization = "PortainerRoleList"
|
|
OperationPortainerRoleInspect Authorization = "PortainerRoleInspect"
|
|
OperationPortainerRoleCreate Authorization = "PortainerRoleCreate"
|
|
OperationPortainerRoleUpdate Authorization = "PortainerRoleUpdate"
|
|
OperationPortainerRoleDelete Authorization = "PortainerRoleDelete"
|
|
OperationPortainerScheduleList Authorization = "PortainerScheduleList"
|
|
OperationPortainerScheduleInspect Authorization = "PortainerScheduleInspect"
|
|
OperationPortainerScheduleFile Authorization = "PortainerScheduleFile"
|
|
OperationPortainerScheduleTasks Authorization = "PortainerScheduleTasks"
|
|
OperationPortainerScheduleCreate Authorization = "PortainerScheduleCreate"
|
|
OperationPortainerScheduleUpdate Authorization = "PortainerScheduleUpdate"
|
|
OperationPortainerScheduleDelete Authorization = "PortainerScheduleDelete"
|
|
OperationPortainerSettingsInspect Authorization = "PortainerSettingsInspect"
|
|
OperationPortainerSettingsUpdate Authorization = "PortainerSettingsUpdate"
|
|
OperationPortainerSettingsLDAPCheck Authorization = "PortainerSettingsLDAPCheck"
|
|
OperationPortainerStackList Authorization = "PortainerStackList"
|
|
OperationPortainerStackInspect Authorization = "PortainerStackInspect"
|
|
OperationPortainerStackFile Authorization = "PortainerStackFile"
|
|
OperationPortainerStackCreate Authorization = "PortainerStackCreate"
|
|
OperationPortainerStackMigrate Authorization = "PortainerStackMigrate"
|
|
OperationPortainerStackUpdate Authorization = "PortainerStackUpdate"
|
|
OperationPortainerStackDelete Authorization = "PortainerStackDelete"
|
|
OperationPortainerTagList Authorization = "PortainerTagList"
|
|
OperationPortainerTagCreate Authorization = "PortainerTagCreate"
|
|
OperationPortainerTagDelete Authorization = "PortainerTagDelete"
|
|
OperationPortainerTeamMembershipList Authorization = "PortainerTeamMembershipList"
|
|
OperationPortainerTeamMembershipCreate Authorization = "PortainerTeamMembershipCreate"
|
|
OperationPortainerTeamMembershipUpdate Authorization = "PortainerTeamMembershipUpdate"
|
|
OperationPortainerTeamMembershipDelete Authorization = "PortainerTeamMembershipDelete"
|
|
OperationPortainerTeamList Authorization = "PortainerTeamList"
|
|
OperationPortainerTeamInspect Authorization = "PortainerTeamInspect"
|
|
OperationPortainerTeamMemberships Authorization = "PortainerTeamMemberships"
|
|
OperationPortainerTeamCreate Authorization = "PortainerTeamCreate"
|
|
OperationPortainerTeamUpdate Authorization = "PortainerTeamUpdate"
|
|
OperationPortainerTeamDelete Authorization = "PortainerTeamDelete"
|
|
OperationPortainerTemplateList Authorization = "PortainerTemplateList"
|
|
OperationPortainerTemplateInspect Authorization = "PortainerTemplateInspect"
|
|
OperationPortainerTemplateCreate Authorization = "PortainerTemplateCreate"
|
|
OperationPortainerTemplateUpdate Authorization = "PortainerTemplateUpdate"
|
|
OperationPortainerTemplateDelete Authorization = "PortainerTemplateDelete"
|
|
OperationPortainerUploadTLS Authorization = "PortainerUploadTLS"
|
|
OperationPortainerUserList Authorization = "PortainerUserList"
|
|
OperationPortainerUserInspect Authorization = "PortainerUserInspect"
|
|
OperationPortainerUserMemberships Authorization = "PortainerUserMemberships"
|
|
OperationPortainerUserCreate Authorization = "PortainerUserCreate"
|
|
OperationPortainerUserUpdate Authorization = "PortainerUserUpdate"
|
|
OperationPortainerUserUpdatePassword Authorization = "PortainerUserUpdatePassword"
|
|
OperationPortainerUserDelete Authorization = "PortainerUserDelete"
|
|
OperationPortainerWebsocketExec Authorization = "PortainerWebsocketExec"
|
|
OperationPortainerWebhookList Authorization = "PortainerWebhookList"
|
|
OperationPortainerWebhookCreate Authorization = "PortainerWebhookCreate"
|
|
OperationPortainerWebhookDelete Authorization = "PortainerWebhookDelete"
|
|
|
|
OperationIntegrationStoridgeAdmin Authorization = "IntegrationStoridgeAdmin"
|
|
|
|
OperationDockerUndefined Authorization = "DockerUndefined"
|
|
OperationDockerAgentUndefined Authorization = "DockerAgentUndefined"
|
|
OperationPortainerUndefined Authorization = "PortainerUndefined"
|
|
|
|
EndpointResourcesAccess Authorization = "EndpointResourcesAccess"
|
|
)
|