internal/worker/purgejob.go (66 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package worker
import (
"context"
"fmt"
"net/http"
"time"
"github.com/Azure/acr-cli/internal/api"
)
type purgeManifestJob struct {
jobBase
client api.AcrCLIClientInterface
digest string
}
type purgeTagJob struct {
jobBase
client api.AcrCLIClientInterface
tag string
}
func newPurgeManifestJob(loginURL string, repoName string, client api.AcrCLIClientInterface, digest string) *purgeManifestJob {
base := jobBase{
loginURL: loginURL,
repoName: repoName,
timeCreated: time.Now().UTC(),
}
return &purgeManifestJob{
jobBase: base,
client: client,
digest: digest,
}
}
func newPurgeTagJob(loginURL string, repoName string, client api.AcrCLIClientInterface, tag string) *purgeTagJob {
base := jobBase{
loginURL: loginURL,
repoName: repoName,
timeCreated: time.Now().UTC(),
}
return &purgeTagJob{
jobBase: base,
client: client,
tag: tag,
}
}
// execute calls acrClient to delete a manifest.
func (job *purgeManifestJob) execute(ctx context.Context) error {
resp, err := job.client.DeleteManifest(ctx, job.repoName, job.digest)
if err == nil {
fmt.Printf("Deleted %s/%s@%s\n", job.loginURL, job.repoName, job.digest)
return nil
}
if resp != nil && resp.Response != nil && resp.StatusCode == http.StatusNotFound {
// If the manifest is not found it can be assumed to have been deleted.
fmt.Printf("Skipped %s/%s@%s, HTTP status: %d\n", job.loginURL, job.repoName, job.digest, resp.StatusCode)
return nil
}
return err
}
// execute calls acrClient to delete a tag.
func (job *purgeTagJob) execute(ctx context.Context) error {
resp, err := job.client.DeleteAcrTag(ctx, job.repoName, job.tag)
if err == nil {
fmt.Printf("Deleted %s/%s:%s\n", job.loginURL, job.repoName, job.tag)
return nil
}
if resp != nil && resp.Response != nil && resp.StatusCode == http.StatusNotFound {
// If the tag is not found it can be assumed to have been deleted.
fmt.Printf("Skipped %s/%s:%s, HTTP status: %d\n", job.loginURL, job.repoName, job.tag, resp.StatusCode)
return nil
}
return err
}