70 lines
1.9 KiB
Go
70 lines
1.9 KiB
Go
package tasks
|
|
|
|
import (
|
|
"context"
|
|
|
|
"forgejo.digital-droplets.de/philschlo/proxui/platform/cluster"
|
|
"forgejo.digital-droplets.de/philschlo/proxui/platform/proxmox"
|
|
)
|
|
|
|
type ClusterRepository interface {
|
|
GetCluster(ctx context.Context, id string) (cluster.Cluster, bool, error)
|
|
}
|
|
|
|
type ProxmoxTaskClientFactory func(cluster cluster.Cluster) (PlatformProxmoxTaskClient, error)
|
|
|
|
type PlatformProxmoxTaskClient interface {
|
|
GetTaskStatus(ctx context.Context, node string, upid string) (proxmox.TaskStatus, error)
|
|
}
|
|
|
|
type ClusterTaskClientResolver struct {
|
|
clusters ClusterRepository
|
|
factory ProxmoxTaskClientFactory
|
|
}
|
|
|
|
func NewClusterTaskClientResolver(clusters ClusterRepository, factory ProxmoxTaskClientFactory) ClusterTaskClientResolver {
|
|
return ClusterTaskClientResolver{
|
|
clusters: clusters,
|
|
factory: factory,
|
|
}
|
|
}
|
|
|
|
func NewDefaultClusterTaskClientResolver(clusters ClusterRepository) ClusterTaskClientResolver {
|
|
return NewClusterTaskClientResolver(clusters, func(cluster cluster.Cluster) (PlatformProxmoxTaskClient, error) {
|
|
return proxmox.NewClient(cluster)
|
|
})
|
|
}
|
|
|
|
func (r ClusterTaskClientResolver) ResolveTaskClient(ctx context.Context, clusterID string) (ProxmoxTaskClient, error) {
|
|
cluster, found, err := r.clusters.GetCluster(ctx, clusterID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !found {
|
|
return nil, ErrClusterNotFound
|
|
}
|
|
|
|
client, err := r.factory(cluster)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return platformTaskClientAdapter{client: client}, nil
|
|
}
|
|
|
|
type platformTaskClientAdapter struct {
|
|
client PlatformProxmoxTaskClient
|
|
}
|
|
|
|
func (a platformTaskClientAdapter) GetTaskStatus(ctx context.Context, node string, upid string) (ProxmoxTaskStatus, error) {
|
|
status, err := a.client.GetTaskStatus(ctx, node, upid)
|
|
if err != nil {
|
|
return ProxmoxTaskStatus{}, err
|
|
}
|
|
|
|
return ProxmoxTaskStatus{
|
|
Status: status.Status,
|
|
ExitStatus: status.ExitStatus,
|
|
}, nil
|
|
}
|