Fix for image pull from private registry (#940)

* Fix for image pull from private registry

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* Refactor and unit tests

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* Including fromDir from airgap mode

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* review comments

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>

* nit fixes

Signed-off-by: Pravin Pushkar <ppushkar@microsoft.com>
This commit is contained in:
Pravin Pushkar 2022-03-31 18:40:43 +05:30 committed by GitHub
parent 3684654834
commit 615c25cae4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 6 deletions

View File

@ -146,9 +146,13 @@ func Init(runtimeVersion, dashboardVersion string, dockerNetwork string, slimMod
if !dockerInstalled {
return errors.New("could not connect to Docker. Docker may not be installed or running")
}
defaultImageRegistryName, err = utils.GetDefaultRegistry(githubContainerRegistryName, dockerContainerRegistryName)
if err != nil {
return err
// Initialize default registry only if it is not airgap mode or from private registries.
if len(strings.TrimSpace(imageRegistryURL)) == 0 && len(strings.TrimSpace(fromDir)) == 0 {
defaultImageRegistryName, err = utils.GetDefaultRegistry(githubContainerRegistryName, dockerContainerRegistryName)
if err != nil {
return err
}
}
}
@ -415,19 +419,20 @@ func runPlacementService(wg *sync.WaitGroup, errorChan chan<- error, info initIn
placementContainerName := utils.CreateContainerName(DaprPlacementContainerName, info.dockerNetwork)
image, err := resolveImageURI(daprImageInfo{
imgInfo := daprImageInfo{
ghcrImageName: daprGhcrImageName,
dockerHubImageName: daprDockerImageName,
imageRegistryURL: info.imageRegistryURL,
imageRegistryName: defaultImageRegistryName,
})
}
image, err := resolveImageURI(imgInfo)
if err != nil {
errorChan <- err
return
}
image = getPlacementImageWithTag(image, info.runtimeVersion)
if defaultImageRegistryName == githubContainerRegistryName {
if checkFallbackImgForPlacement(imgInfo, info.fromDir) {
if !TryPullImage(image) {
print.InfoStatusEvent(os.Stdout, "Placement image not found in Github container registry, pulling it from Docker Hub")
image = getPlacementImageWithTag(daprDockerImageName, info.runtimeVersion)
@ -1067,6 +1072,15 @@ func getPlacementImageWithTag(name, version string) string {
return fmt.Sprintf("%s:%s", name, version)
}
// Try for fallback image from docker iff this init flow is using GHCR as default registry.
// TODO: We may want to remove this logic completely after next couple of releases.
func checkFallbackImgForPlacement(imageInfo daprImageInfo, fromDir string) bool {
if imageInfo.imageRegistryURL != "" || fromDir != "" {
return false
}
return imageInfo.imageRegistryName == githubContainerRegistryName
}
func resolveImageURI(imageInfo daprImageInfo) (string, error) {
if imageInfo.imageRegistryURL != "" {
if imageInfo.imageRegistryURL == ghcrURI || imageInfo.imageRegistryURL == "docker.io" {

View File

@ -232,3 +232,58 @@ func TestResolveImageErr(t *testing.T) {
})
}
}
func TestCheckFallbackImg(t *testing.T) {
daprImgWithPrivateRegAndDefAsDocker := daprImageInfo{
ghcrImageName: daprGhcrImageName,
dockerHubImageName: daprDockerImageName,
imageRegistryURL: "example.io/user",
imageRegistryName: "dockerhub",
}
daprImgWithPrivateRegAndDefAsGHCR := daprImageInfo{
ghcrImageName: daprGhcrImageName,
dockerHubImageName: daprDockerImageName,
imageRegistryURL: "example.io/user",
imageRegistryName: "ghcr",
}
daprImgWithPrivateRegAndNoDef := daprImageInfo{
ghcrImageName: daprGhcrImageName,
dockerHubImageName: daprDockerImageName,
imageRegistryURL: "example.io/user",
imageRegistryName: "",
}
daprImgWithDefAsDocker := daprImageInfo{
ghcrImageName: daprGhcrImageName,
dockerHubImageName: daprDockerImageName,
imageRegistryURL: "",
imageRegistryName: "dockerhub",
}
daprImgWithDefAsGHCR := daprImageInfo{
ghcrImageName: daprGhcrImageName,
dockerHubImageName: daprDockerImageName,
imageRegistryURL: "",
imageRegistryName: "ghcr",
}
tests := []struct {
name string
imageInfo daprImageInfo
fromDir string
expect bool
}{
{"checkFallbackImg() with private registry and def as Docker Hub", daprImgWithPrivateRegAndDefAsDocker, "", false},
{"checkFallbackImg() with private registry and def as GHCR", daprImgWithPrivateRegAndDefAsGHCR, "", false},
{"checkFallbackImg() with private registry with no Def", daprImgWithPrivateRegAndNoDef, "", false},
{"checkFallbackImg() with no private registry and def as Docker Hub", daprImgWithDefAsDocker, "", false},
{"checkFallbackImg() with no private registry and def as GHCR", daprImgWithDefAsGHCR, "", true},
{"checkFallbackImg() airgap mode with no private registry and def as GHCR", daprImgWithDefAsGHCR, "testDir", false},
{"checkFallbackImg() airgap mode with no private registry and def as Docker Hub", daprImgWithDefAsDocker, "testDir", false},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
got := checkFallbackImgForPlacement(test.imageInfo, test.fromDir)
assert.Equal(t, test.expect, got)
})
}
}