mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-04-28 11:30:15 +00:00
Fixed an issue where all Docker containers were showing 'click to update' even when they were up to date. The root cause was comparing the wrong digest types: - Previously: Compared ImageID (local config hash) vs registry manifest digest - Now: Uses RepoDigests from image inspect, which is the actual manifest digest that Docker received from the registry when pulling the image For multi-arch images, the registry returns a manifest list digest, while Docker stores the platform-specific image config digest locally. These will never match, causing false positives for all multi-arch images. Changes: - Added ImageInspectWithRaw to dockerClient interface - Added getImageRepoDigest method to extract RepoDigest from image - Added matchesImageReference helper for Docker Hub naming conventions - Added tests for matchesImageReference Fixes #955
77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package ai
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type failingMetadataProvider struct {
|
|
guestErr error
|
|
dockerErr error
|
|
hostErr error
|
|
}
|
|
|
|
func (m *failingMetadataProvider) SetGuestURL(guestID, customURL string) error {
|
|
return m.guestErr
|
|
}
|
|
|
|
func (m *failingMetadataProvider) SetDockerURL(resourceID, customURL string) error {
|
|
return m.dockerErr
|
|
}
|
|
|
|
func (m *failingMetadataProvider) SetHostURL(hostID, customURL string) error {
|
|
return m.hostErr
|
|
}
|
|
|
|
func TestService_SetMetadataProvider(t *testing.T) {
|
|
svc := &Service{}
|
|
mp := &mockMetadataProvider{}
|
|
|
|
svc.SetMetadataProvider(mp)
|
|
|
|
if svc.metadataProvider != mp {
|
|
t.Fatal("expected metadata provider to be set")
|
|
}
|
|
}
|
|
|
|
func TestService_SetResourceURL_InvalidScheme(t *testing.T) {
|
|
svc := &Service{metadataProvider: &mockMetadataProvider{}}
|
|
|
|
err := svc.SetResourceURL("guest", "id-1", "ftp://example.com")
|
|
if err == nil || !strings.Contains(err.Error(), "URL must use http:// or https:// scheme") {
|
|
t.Fatalf("expected scheme error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestService_SetResourceURL_MissingHost(t *testing.T) {
|
|
svc := &Service{metadataProvider: &mockMetadataProvider{}}
|
|
|
|
err := svc.SetResourceURL("guest", "id-1", "http://")
|
|
if err == nil || !strings.Contains(err.Error(), "URL must include a host") {
|
|
t.Fatalf("expected host error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestService_SetResourceURL_ProviderErrors(t *testing.T) {
|
|
svc := &Service{metadataProvider: &failingMetadataProvider{
|
|
guestErr: errors.New("guest error"),
|
|
dockerErr: errors.New("docker error"),
|
|
hostErr: errors.New("host error"),
|
|
}}
|
|
|
|
err := svc.SetResourceURL("guest", "id-1", "https://example.com")
|
|
if err == nil || !strings.Contains(err.Error(), "failed to set guest URL") {
|
|
t.Fatalf("expected wrapped guest error, got %v", err)
|
|
}
|
|
|
|
err = svc.SetResourceURL("docker", "id-2", "https://example.com")
|
|
if err == nil || !strings.Contains(err.Error(), "failed to set Docker URL") {
|
|
t.Fatalf("expected wrapped docker error, got %v", err)
|
|
}
|
|
|
|
err = svc.SetResourceURL("host", "id-3", "https://example.com")
|
|
if err == nil || !strings.Contains(err.Error(), "failed to set host URL") {
|
|
t.Fatalf("expected wrapped host error, got %v", err)
|
|
}
|
|
}
|