mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-19 18:32:29 +00:00
2f5aa20122
Refs #1460
213 lines
6.6 KiB
Go
213 lines
6.6 KiB
Go
package api
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/config"
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/mock"
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/monitoring"
|
|
)
|
|
|
|
func mockTrueNASConnectionResponses() []trueNASConnectionResponse {
|
|
fixture := mock.DefaultTrueNASConnectionFixture()
|
|
|
|
instance := config.TrueNASInstance{
|
|
ID: fixture.ID,
|
|
Name: fixture.Name,
|
|
Host: fixture.Host,
|
|
Port: fixture.Port,
|
|
APIKey: fixture.APIKey,
|
|
UseHTTPS: fixture.UseHTTPS,
|
|
Enabled: fixture.Enabled,
|
|
PollIntervalSecs: fixture.PollIntervalSeconds,
|
|
}
|
|
instance.ApplyDefaults()
|
|
|
|
observed := &monitoring.TrueNASConnectionObservedSummary{
|
|
Host: fixture.Host,
|
|
ResourceID: fixture.ResourceID,
|
|
Systems: fixture.Systems,
|
|
StoragePools: fixture.StoragePools,
|
|
Datasets: fixture.Datasets,
|
|
Apps: fixture.Apps,
|
|
Disks: fixture.Disks,
|
|
RecoveryArtifacts: fixture.RecoveryArtifacts,
|
|
CollectedAt: mockPlatformTimePointer(fixture.CollectedAt),
|
|
}
|
|
|
|
return []trueNASConnectionResponse{{
|
|
TrueNASInstance: instance.Redacted(),
|
|
Poll: &monitoring.TrueNASConnectionPollStatus{
|
|
IntervalSeconds: instance.EffectivePollIntervalSecs(),
|
|
LastAttemptAt: mockPlatformTimePointer(fixture.CollectedAt),
|
|
LastSuccessAt: mockPlatformTimePointer(fixture.CollectedAt),
|
|
},
|
|
Observed: observed,
|
|
}}
|
|
}
|
|
|
|
func mockVMwareConnectionResponses() []vmwareConnectionResponse {
|
|
fixture := mock.DefaultVMwareConnectionFixture()
|
|
|
|
instance := config.VMwareVCenterInstance{
|
|
ID: fixture.ID,
|
|
Name: fixture.Name,
|
|
Host: fixture.Host,
|
|
Port: fixture.Port,
|
|
Username: fixture.Username,
|
|
Password: fixture.Password,
|
|
Enabled: fixture.Enabled,
|
|
}
|
|
instance.ApplyDefaults()
|
|
|
|
return []vmwareConnectionResponse{{
|
|
VMwareVCenterInstance: instance.Redacted(),
|
|
Poll: &monitoring.VMwareConnectionPollStatus{
|
|
IntervalSeconds: fixture.PollIntervalSeconds,
|
|
LastAttemptAt: mockPlatformTimePointer(fixture.CollectedAt),
|
|
LastSuccessAt: mockPlatformTimePointer(fixture.CollectedAt),
|
|
},
|
|
Observed: &monitoring.VMwareConnectionObservedSummary{
|
|
CollectedAt: mockPlatformTimePointer(fixture.CollectedAt),
|
|
Hosts: fixture.Hosts,
|
|
VMs: fixture.VMs,
|
|
Datastores: fixture.Datastores,
|
|
VIRelease: fixture.VIRelease,
|
|
},
|
|
}}
|
|
}
|
|
|
|
func mockAvailabilityConnectionInputs() ([]config.AvailabilityTarget, map[string]monitoring.AvailabilityProbeStatus) {
|
|
fixtures := mock.AvailabilityFixtures()
|
|
targets := make([]config.AvailabilityTarget, 0, len(fixtures))
|
|
statuses := make(map[string]monitoring.AvailabilityProbeStatus, len(fixtures))
|
|
for _, fixture := range fixtures {
|
|
target := mockAvailabilityConfigTarget(fixture.Target)
|
|
if target.ID == "" {
|
|
continue
|
|
}
|
|
targets = append(targets, target)
|
|
statuses[target.ID] = mockAvailabilityProbeStatus(fixture, target)
|
|
}
|
|
return targets, statuses
|
|
}
|
|
|
|
func mergeAvailabilityTargets(existing, additions []config.AvailabilityTarget) []config.AvailabilityTarget {
|
|
if len(additions) == 0 {
|
|
return existing
|
|
}
|
|
out := make([]config.AvailabilityTarget, 0, len(existing)+len(additions))
|
|
seen := make(map[string]struct{}, len(existing)+len(additions))
|
|
for _, target := range existing {
|
|
target = config.NormalizeAvailabilityTarget(target)
|
|
if target.ID == "" {
|
|
continue
|
|
}
|
|
seen[target.ID] = struct{}{}
|
|
out = append(out, target)
|
|
}
|
|
for _, target := range additions {
|
|
target = config.NormalizeAvailabilityTarget(target)
|
|
if target.ID == "" {
|
|
continue
|
|
}
|
|
if _, ok := seen[target.ID]; ok {
|
|
continue
|
|
}
|
|
seen[target.ID] = struct{}{}
|
|
out = append(out, target)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func mergeAvailabilityStatuses(existing, additions map[string]monitoring.AvailabilityProbeStatus) map[string]monitoring.AvailabilityProbeStatus {
|
|
if len(existing) == 0 && len(additions) == 0 {
|
|
return map[string]monitoring.AvailabilityProbeStatus{}
|
|
}
|
|
out := make(map[string]monitoring.AvailabilityProbeStatus, len(existing)+len(additions))
|
|
for id, status := range existing {
|
|
if id != "" {
|
|
out[id] = status
|
|
}
|
|
}
|
|
for id, status := range additions {
|
|
if id != "" {
|
|
out[id] = status
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func mockAvailabilityTargetResponses() []availabilityTargetResponse {
|
|
fixtures := mock.AvailabilityFixtures()
|
|
responses := make([]availabilityTargetResponse, 0, len(fixtures))
|
|
for _, fixture := range fixtures {
|
|
target := mockAvailabilityConfigTarget(fixture.Target)
|
|
if target.ID == "" {
|
|
continue
|
|
}
|
|
status := mockAvailabilityProbeStatus(fixture, target)
|
|
responses = append(responses, availabilityTargetResponse{
|
|
AvailabilityTarget: target,
|
|
Status: &status,
|
|
})
|
|
}
|
|
return responses
|
|
}
|
|
|
|
func mockAvailabilityTestResponse(targetID string) (availabilityTestResponse, bool) {
|
|
for _, fixture := range mock.AvailabilityFixtures() {
|
|
target := mockAvailabilityConfigTarget(fixture.Target)
|
|
if target.ID != targetID {
|
|
continue
|
|
}
|
|
response := availabilityTestResponse{
|
|
Success: fixture.Available,
|
|
LatencyMillis: fixture.LatencyMillis,
|
|
Error: fixture.LastError,
|
|
}
|
|
return response, true
|
|
}
|
|
return availabilityTestResponse{}, false
|
|
}
|
|
|
|
func mockAvailabilityConfigTarget(target mock.AvailabilityTargetFixture) config.AvailabilityTarget {
|
|
return config.NormalizeAvailabilityTarget(config.AvailabilityTarget{
|
|
ID: target.ID,
|
|
Name: target.Name,
|
|
Address: target.Address,
|
|
Protocol: config.AvailabilityProbeProtocol(target.Protocol),
|
|
Port: target.Port,
|
|
Path: target.Path,
|
|
Enabled: target.Enabled,
|
|
PollIntervalSecs: target.PollIntervalSecs,
|
|
TimeoutMillis: target.TimeoutMillis,
|
|
FailureThreshold: target.FailureThreshold,
|
|
})
|
|
}
|
|
|
|
func mockAvailabilityProbeStatus(fixture mock.AvailabilityFixture, target config.AvailabilityTarget) monitoring.AvailabilityProbeStatus {
|
|
return monitoring.AvailabilityProbeStatus{
|
|
TargetID: target.ID,
|
|
Name: target.DisplayName(),
|
|
Address: target.Address,
|
|
Protocol: string(target.Protocol),
|
|
Enabled: target.Enabled,
|
|
Available: fixture.Available,
|
|
LastChecked: fixture.LastChecked,
|
|
LastSuccess: fixture.LastSuccess,
|
|
LatencyMillis: fixture.LatencyMillis,
|
|
ConsecutiveFailures: fixture.ConsecutiveFailures,
|
|
LastError: fixture.LastError,
|
|
FailureThreshold: target.EffectiveFailureThreshold(),
|
|
}
|
|
}
|
|
|
|
func mockPlatformTimePointer(value time.Time) *time.Time {
|
|
if value.IsZero() {
|
|
return nil
|
|
}
|
|
copied := value
|
|
return &copied
|
|
}
|