ValidateReference for path and version
(ref, version string, u *url.URL)
| 843 | |
| 844 | // ValidateReference for path and version |
| 845 | func (c *Client) ValidateReference(ref, version string, u *url.URL) (string, *url.URL, error) { |
| 846 | var tag string |
| 847 | |
| 848 | registryReference, err := newReference(u.Host + u.Path) |
| 849 | if err != nil { |
| 850 | return "", nil, err |
| 851 | } |
| 852 | |
| 853 | if version == "" { |
| 854 | // Use OCI URI tag as default |
| 855 | version = registryReference.Tag |
| 856 | } else { |
| 857 | if registryReference.Tag != "" && registryReference.Tag != version { |
| 858 | return "", nil, fmt.Errorf("chart reference and version mismatch: %s is not %s", version, registryReference.Tag) |
| 859 | } |
| 860 | } |
| 861 | |
| 862 | if registryReference.Digest != "" { |
| 863 | if version == "" { |
| 864 | // Install by digest only |
| 865 | return "", u, nil |
| 866 | } |
| 867 | u.Path = fmt.Sprintf("%s@%s", registryReference.Repository, registryReference.Digest) |
| 868 | |
| 869 | // Validate the tag if it was specified |
| 870 | path := registryReference.Registry + "/" + registryReference.Repository + ":" + version |
| 871 | desc, err := c.Resolve(path) |
| 872 | if err != nil { |
| 873 | // The resource does not have to be tagged when digest is specified |
| 874 | return "", u, nil |
| 875 | } |
| 876 | if desc.Digest.String() != registryReference.Digest { |
| 877 | return "", nil, fmt.Errorf("chart reference digest mismatch: %s is not %s", desc.Digest.String(), registryReference.Digest) |
| 878 | } |
| 879 | return registryReference.Digest, u, nil |
| 880 | } |
| 881 | |
| 882 | // Evaluate whether an explicit version has been provided. Otherwise, determine version to use |
| 883 | _, errSemVer := semver.NewVersion(version) |
| 884 | if errSemVer == nil { |
| 885 | tag = version |
| 886 | } else { |
| 887 | // Retrieve list of repository tags |
| 888 | tags, err := c.Tags(strings.TrimPrefix(ref, OCIScheme+"://")) |
| 889 | if err != nil { |
| 890 | return "", nil, err |
| 891 | } |
| 892 | if len(tags) == 0 { |
| 893 | return "", nil, fmt.Errorf("unable to locate any tags in provided repository: %s", ref) |
| 894 | } |
| 895 | |
| 896 | // Determine if version provided |
| 897 | // If empty, try to get the highest available tag |
| 898 | // If exact version, try to find it |
| 899 | // If semver constraint string, try to find a match |
| 900 | tag, err = GetTagMatchingVersionOrConstraint(tags, version) |
| 901 | if err != nil { |
| 902 | return "", nil, err |
no test coverage detected