2020-12-06 13:21:04 +01:00
|
|
|
package manifest
|
|
|
|
|
|
|
|
import (
|
2023-04-12 17:15:12 +02:00
|
|
|
"errors"
|
2020-12-06 13:21:04 +01:00
|
|
|
"fmt"
|
2023-04-12 17:15:12 +02:00
|
|
|
url2 "net/url"
|
|
|
|
|
2020-12-06 13:21:04 +01:00
|
|
|
"github.com/containrrr/watchtower/pkg/registry/helpers"
|
|
|
|
"github.com/containrrr/watchtower/pkg/types"
|
2023-10-04 12:17:38 +02:00
|
|
|
ref "github.com/distribution/reference"
|
2020-12-06 13:21:04 +01:00
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
// BuildManifestURL from raw image data
|
|
|
|
func BuildManifestURL(container types.Container) (string, error) {
|
2023-04-12 17:15:12 +02:00
|
|
|
normalizedRef, err := ref.ParseDockerRef(container.ImageName())
|
2020-12-06 13:21:04 +01:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
2023-04-12 17:15:12 +02:00
|
|
|
normalizedTaggedRef, isTagged := normalizedRef.(ref.NamedTagged)
|
|
|
|
if !isTagged {
|
|
|
|
return "", errors.New("Parsed container image ref has no tag: " + normalizedRef.String())
|
|
|
|
}
|
2020-12-06 13:21:04 +01:00
|
|
|
|
2023-04-12 17:15:12 +02:00
|
|
|
host, _ := helpers.GetRegistryAddress(normalizedTaggedRef.Name())
|
|
|
|
img, tag := ref.Path(normalizedTaggedRef), normalizedTaggedRef.Tag()
|
2020-12-06 13:21:04 +01:00
|
|
|
|
|
|
|
logrus.WithFields(logrus.Fields{
|
|
|
|
"image": img,
|
|
|
|
"tag": tag,
|
2023-04-12 17:15:12 +02:00
|
|
|
"normalized": normalizedTaggedRef.Name(),
|
2020-12-06 13:21:04 +01:00
|
|
|
"host": host,
|
|
|
|
}).Debug("Parsing image ref")
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
2020-12-21 18:06:14 +01:00
|
|
|
|
2020-12-06 13:21:04 +01:00
|
|
|
url := url2.URL{
|
|
|
|
Scheme: "https",
|
|
|
|
Host: host,
|
|
|
|
Path: fmt.Sprintf("/v2/%s/manifests/%s", img, tag),
|
|
|
|
}
|
|
|
|
return url.String(), nil
|
|
|
|
}
|