mirror of
https://github.com/portainer/portainer.git
synced 2025-07-24 15:59:41 +02:00
feat(edge-compute): move host jobs to edge (#3840)
* feat(endpoints): create an associated endpoints selector * feat(schedules): remove edge specific explanations * refactor(schedule): replace multi-endpoint-selector * refactor(schedule): move controller to single file * refactor(endpoints): remove multi-endpoint-selector * feat(edge): rename host jobs to edge jobs * feat(edge-jobs): remove edge warning * refactor(edge-jobs): move schedule pages to edge * refactor(edge-jobs): mv views to edgeJobs * refactor(edge-jobs): rename edge jobs * refactor(edge-jobs): move services to edge * refactor(edge-jobs): move tasks datatable * fix(edge-jobs): fix import * fix(edge-jobs): use right services * feat(settings): adjust host management description * feat(edge-jobs): introduce interfaces and types * feat(edge-jobs): implement bolt service * refactor(edge-jobs): replace schedule routes * refactor(edge-job): replace Schedule service * refactor(edge-jobs): remove job_script_exec * refactor(host): remove jobs table * feat(edge-jobs): replace schedule * feat(edge-jobs): load file on inspect * fix(edge-job): parse cron correctly * feat(edge-jobs): show tasks * feat(host): rename tooltip * refactor(host): remove old components * refactor(main): remove schedule types * refactor(snapshot): replace job service with snapshot service * refactor(jobs): remove jobs form and datatable * feat(edge-jobs): create db migration * fix(main): start snapshot service with correct interval * feat(settings): change host tooltip * feat(edge-jobs): load endpoints * fix(edge-job): disable form submit when form is invalid * refactor(edge-compute): use const * refactor(edge-jobs): use generic controller * refactor(edge-jobs): replace $scope with controllerAs * refactor(edge-jobs): replace routes with components * refactor(edge-jobs): replace functions with classes * refactor(edge-jobs): use async/await * refactor(edge-jobs): rename functions * feat(edge-jobs): introduce beta panel * feat(edge-jobs): allow single character names * fix(snapshot): run snapshot in coroutine * feat(edge-jobs): add logs status * feat(filesystem): add edge job logs methods * feat(edge-jobs): intoduce edge jobs tasks api * feat(edge-jobs): remove schedule task model * fix(fs): build edge job task file path * fix(edge-jobs): update task meta * fix(edge-jobs): return a list of endpoints * feat(edge-jobs): update logs from agent * feat(edge-jobs): collect logs * feat(edge-jobs): rename url * feat(edge-jobs): refresh to same tab * feat(edge-jobs): remove old info * refactor(edge-jobs): rename script path json * fix(edge-job): save file before adding job * feat(edge-job): show retrieving logs label * feat(edge-job): replace cron with 5 places * refactor(edge-jobs): replace tasks with results * feat(edge-jobs): add auto refresh until logs are collected * feat(edge-jobs): fix column size * feat(edge-job): display editor * feat(edge-job): add name validation * feat(edge-job): set default time for 1 hour from now * feat(edge-job): add validation for cron format * feat(edge-job): add a note about timezone * fix(edge-job): replace regex * fix(edge-job): check for every minute cron * style(edge-jobs): add reference for cron regex * refactor(edge-jobs): rename migration name * refactor(edge-job): rename edge job response * refactor(snapshot): rename snapshot endpoint method * refactor(edge-jobs): move tasks handler to edgejobs * feat(security): introduce a middleware for edge compute operations * feat(edge-job): use edge compute middleware * feat(edge-groups): filter http actions based on edge setting * fix(security): return from edge bouncer if failed * feat(edge-stacks): filter http actions based on edge setting * feat(edge-groups): show error when failed to load groups * refactor(db): remove edge-jobs migration * refactor(migrator): remove unused dependency Co-authored-by: Anthony Lapenna <lapenna.anthony@gmail.com>
This commit is contained in:
parent
b6f5d8f90e
commit
24528ecea8
120 changed files with 2624 additions and 3484 deletions
161
api/portainer.go
161
api/portainer.go
|
@ -76,6 +76,7 @@ type (
|
|||
|
||||
DockerHub() DockerHubService
|
||||
EdgeGroup() EdgeGroupService
|
||||
EdgeJob() EdgeJobService
|
||||
EdgeStack() EdgeStackService
|
||||
Endpoint() EndpointService
|
||||
EndpointGroup() EndpointGroupService
|
||||
|
@ -84,7 +85,6 @@ type (
|
|||
Registry() RegistryService
|
||||
ResourceControl() ResourceControlService
|
||||
Role() RoleService
|
||||
Schedule() ScheduleService
|
||||
Settings() SettingsService
|
||||
Stack() StackService
|
||||
Tag() TagService
|
||||
|
@ -117,7 +117,32 @@ type (
|
|||
// EdgeGroupID represents an Edge group identifier
|
||||
EdgeGroupID int
|
||||
|
||||
// EdgeJob represents a job that can run on Edge environments.
|
||||
EdgeJob struct {
|
||||
ID EdgeJobID `json:"Id"`
|
||||
Created int64 `json:"Created"`
|
||||
CronExpression string `json:"CronExpression"`
|
||||
Endpoints map[EndpointID]EdgeJobEndpointMeta `json:"Endpoints"`
|
||||
Name string `json:"Name"`
|
||||
ScriptPath string `json:"ScriptPath"`
|
||||
Recurring bool `json:"Recurring"`
|
||||
Version int `json:"Version"`
|
||||
}
|
||||
|
||||
// EdgeJobEndpointMeta represents a meta data object for an Edge job and Endpoint relation
|
||||
EdgeJobEndpointMeta struct {
|
||||
LogsStatus EdgeJobLogsStatus
|
||||
CollectLogs bool
|
||||
}
|
||||
|
||||
// EdgeJobID represents an Edge job identifier
|
||||
EdgeJobID int
|
||||
|
||||
// EdgeJobLogsStatus represent status of logs collection job
|
||||
EdgeJobLogsStatus int
|
||||
|
||||
// EdgeSchedule represents a scheduled job that can run on Edge environments.
|
||||
// Deprecated in favor of EdgeJob
|
||||
EdgeSchedule struct {
|
||||
ID ScheduleID `json:"Id"`
|
||||
CronExpression string `json:"CronExpression"`
|
||||
|
@ -417,22 +442,19 @@ type (
|
|||
// 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
|
||||
// Deprecated in favor of EdgeJob
|
||||
Schedule struct {
|
||||
ID ScheduleID `json:"Id"`
|
||||
Name string
|
||||
CronExpression string
|
||||
Recurring bool
|
||||
Created int64
|
||||
JobType JobType
|
||||
EdgeSchedule *EdgeSchedule
|
||||
ScriptExecutionJob *ScriptExecutionJob
|
||||
SnapshotJob *SnapshotJob
|
||||
|
||||
// Deprecated fields
|
||||
EndpointSyncJob *EndpointSyncJob
|
||||
ID ScheduleID `json:"Id"`
|
||||
Name string
|
||||
CronExpression string
|
||||
Recurring bool
|
||||
Created int64
|
||||
JobType JobType
|
||||
EdgeSchedule *EdgeSchedule
|
||||
}
|
||||
|
||||
// ScheduleID represents a schedule identifier.
|
||||
// Deprecated in favor of EdgeJob
|
||||
ScheduleID int
|
||||
|
||||
// ScriptExecutionJob represents a scheduled job that can execute a script via a privileged container
|
||||
|
@ -484,9 +506,6 @@ type (
|
|||
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"`
|
||||
|
@ -664,7 +683,7 @@ type (
|
|||
Status string
|
||||
LastActivity time.Time
|
||||
Port int
|
||||
Schedules []EdgeSchedule
|
||||
Jobs []EdgeJob
|
||||
Credentials string
|
||||
}
|
||||
|
||||
|
@ -741,6 +760,35 @@ type (
|
|||
UpdateDockerHub(registry *DockerHub) 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
|
||||
}
|
||||
|
||||
// EdgeJobService represents a service to manage Edge jobs
|
||||
EdgeJobService interface {
|
||||
EdgeJobs() ([]EdgeJob, error)
|
||||
EdgeJob(ID EdgeJobID) (*EdgeJob, error)
|
||||
CreateEdgeJob(edgeJob *EdgeJob) error
|
||||
UpdateEdgeJob(ID EdgeJobID, edgeJob *EdgeJob) error
|
||||
DeleteEdgeJob(ID EdgeJobID) error
|
||||
GetNextIdentifier() int
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
// EndpointService represents a service for managing endpoint data
|
||||
EndpointService interface {
|
||||
Endpoint(ID EndpointID) (*Endpoint, error)
|
||||
|
@ -806,8 +854,11 @@ type (
|
|||
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
|
||||
StoreEdgeJobFileFromBytes(identifier string, data []byte) (string, error)
|
||||
GetEdgeJobFolder(identifier string) string
|
||||
ClearEdgeJobTaskLogs(edgeJobID, taskID string) error
|
||||
GetEdgeJobTaskLogFileContent(edgeJobID, taskID string) (string, error)
|
||||
StoreEdgeJobTaskLogFileFromBytes(edgeJobID, taskID string, data []byte) error
|
||||
ExtractExtensionArchive(data []byte) error
|
||||
GetBinaryFolder() string
|
||||
}
|
||||
|
@ -818,26 +869,6 @@ type (
|
|||
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)
|
||||
|
@ -879,8 +910,8 @@ type (
|
|||
SetTunnelStatusToRequired(endpointID EndpointID) error
|
||||
SetTunnelStatusToIdle(endpointID EndpointID)
|
||||
GetTunnelDetails(endpointID EndpointID) *TunnelDetails
|
||||
AddSchedule(endpointID EndpointID, schedule *EdgeSchedule)
|
||||
RemoveSchedule(scheduleID ScheduleID)
|
||||
AddEdgeJob(endpointID EndpointID, edgeJob *EdgeJob)
|
||||
RemoveEdgeJob(edgeJobID EdgeJobID)
|
||||
}
|
||||
|
||||
// RoleService represents a service for managing user roles
|
||||
|
@ -891,17 +922,6 @@ type (
|
|||
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)
|
||||
|
@ -1001,25 +1021,6 @@ type (
|
|||
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 (
|
||||
|
@ -1072,6 +1073,16 @@ const (
|
|||
AuthenticationOAuth
|
||||
)
|
||||
|
||||
const (
|
||||
_ EdgeJobLogsStatus = iota
|
||||
// EdgeJobLogsStatusIdle represents an idle log collection job
|
||||
EdgeJobLogsStatusIdle
|
||||
// EdgeJobLogsStatusPending represents a pending log collection job
|
||||
EdgeJobLogsStatusPending
|
||||
// EdgeJobLogsStatusCollected represents a completed log collection job
|
||||
EdgeJobLogsStatusCollected
|
||||
)
|
||||
|
||||
const (
|
||||
_ EdgeStackStatusType = iota
|
||||
//StatusOk represents a successfully deployed edge stack
|
||||
|
@ -1120,14 +1131,8 @@ const (
|
|||
|
||||
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 (Deprecated)
|
||||
EndpointSyncJobType
|
||||
SnapshotJobType = 2
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue