[feat]: [AH-284]: Delete Artifact and Delete Artifact Version (#2788)

* pr review
* lint
* pr reviews
* pr reviews
* pr reviews
* fix
* Merge branch 'main' of https://git0.harness.io/l7B_kbSEQD2wjrM7PShm5w/PROD/Harness_Commons/gitness into AH-284-delete-flows
* [feat]: [AH-284]: Delete flows
pull/3576/head
Pragyesh Mishra 2024-10-21 10:11:14 +00:00 committed by Harness
parent cc7320e9af
commit 18eb27aa15
9 changed files with 742 additions and 65 deletions

View File

@ -76,6 +76,7 @@ const (
ResourceTypeRepositorySettings ResourceType = "repository_settings" ResourceTypeRepositorySettings ResourceType = "repository_settings"
ResourceTypeRegistry ResourceType = "registry" ResourceTypeRegistry ResourceType = "registry"
ResourceTypeRegistryUpstreamProxy ResourceType = "registry_upstream_proxy" ResourceTypeRegistryUpstreamProxy ResourceType = "registry_upstream_proxy"
ResourceTypeRegistryArtifact ResourceType = "registry_artifact"
) )
func (a ResourceType) Validate() error { func (a ResourceType) Validate() error {
@ -86,7 +87,8 @@ func (a ResourceType) Validate() error {
ResourceTypePullRequest, ResourceTypePullRequest,
ResourceTypeRepositorySettings, ResourceTypeRepositorySettings,
ResourceTypeRegistry, ResourceTypeRegistry,
ResourceTypeRegistryUpstreamProxy: ResourceTypeRegistryUpstreamProxy,
ResourceTypeRegistryArtifact:
return nil return nil
default: default:

View File

@ -0,0 +1,140 @@
// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package metadata
import (
"context"
"fmt"
"net/http"
apiauth "github.com/harness/gitness/app/api/auth"
"github.com/harness/gitness/app/api/request"
"github.com/harness/gitness/audit"
"github.com/harness/gitness/registry/app/api/openapi/contracts/artifact"
registryTypes "github.com/harness/gitness/registry/types"
"github.com/harness/gitness/types/enum"
"github.com/rs/zerolog/log"
)
func (c *APIController) DeleteArtifact(ctx context.Context, r artifact.DeleteArtifactRequestObject) (
artifact.DeleteArtifactResponseObject, error) {
regInfo, err := c.GetRegistryRequestBaseInfo(ctx, "", string(r.RegistryRef))
if err != nil {
return artifact.DeleteArtifact400JSONResponse{
BadRequestJSONResponse: artifact.BadRequestJSONResponse(
*GetErrorResponse(http.StatusBadRequest, err.Error()),
),
}, err
}
space, err := c.SpaceStore.FindByRef(ctx, regInfo.ParentRef)
if err != nil {
return artifact.DeleteArtifact400JSONResponse{
BadRequestJSONResponse: artifact.BadRequestJSONResponse(
*GetErrorResponse(http.StatusBadRequest, err.Error()),
),
}, err
}
session, _ := request.AuthSessionFrom(ctx)
if err = apiauth.CheckSpaceScope(
ctx,
c.Authorizer,
session,
space,
enum.ResourceTypeRegistry,
enum.PermissionArtifactsDelete,
); err != nil {
return artifact.DeleteArtifact403JSONResponse{
UnauthorizedJSONResponse: artifact.UnauthorizedJSONResponse(
*GetErrorResponse(http.StatusForbidden, err.Error()),
),
}, err
}
repoEntity, err := c.RegistryRepository.GetByParentIDAndName(ctx, regInfo.parentID, regInfo.RegistryIdentifier)
if len(repoEntity.Name) == 0 {
return artifact.DeleteArtifact404JSONResponse{
NotFoundJSONResponse: artifact.NotFoundJSONResponse(
*GetErrorResponse(http.StatusNotFound, "registry doesn't exist with this key"),
),
}, nil
}
if err != nil {
return throwDeleteArtifact500Error(err), err
}
artifactName := string(r.Artifact)
err = c.tx.WithTx(
ctx, func(ctx context.Context) error {
err = c.disableImageStatus(
ctx, regInfo, artifactName,
)
if err != nil {
return fmt.Errorf("failed to delete artifact: %w", err)
}
err := c.ManifestStore.DeleteManifestsByImageName(ctx, regInfo.RegistryID, artifactName)
if err != nil {
return fmt.Errorf("failed to delete artifact: %w", err)
}
auditErr := c.AuditService.Log(
ctx,
session.Principal,
audit.NewResource(audit.ResourceTypeRegistryArtifact, string(r.Artifact)),
audit.ActionDeleted,
regInfo.ParentRef,
audit.WithData("registry name", repoEntity.Name),
audit.WithData("artifact name", string(r.Artifact)),
)
if auditErr != nil {
log.Ctx(ctx).Warn().Msgf("failed to insert audit log for delete tag operation: %s", auditErr)
}
return nil
},
)
if err != nil {
return throwDeleteArtifact500Error(err), err
}
return artifact.DeleteArtifact200JSONResponse{
SuccessJSONResponse: artifact.SuccessJSONResponse(*GetSuccessResponse()),
}, nil
}
func (c *APIController) disableImageStatus(
ctx context.Context,
regInfo *RegistryRequestBaseInfo, artifactName string,
) error {
image := &registryTypes.Image{
Name: artifactName,
RegistryID: regInfo.RegistryID,
Enabled: false,
}
err := c.ImageStore.UpdateStatus(ctx, image)
return err
}
func throwDeleteArtifact500Error(err error) artifact.DeleteArtifact500JSONResponse {
return artifact.DeleteArtifact500JSONResponse{
InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
*GetErrorResponse(http.StatusInternalServerError, err.Error()),
),
}
}

View File

@ -0,0 +1,118 @@
// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package metadata
import (
"context"
"net/http"
apiauth "github.com/harness/gitness/app/api/auth"
"github.com/harness/gitness/app/api/request"
"github.com/harness/gitness/audit"
"github.com/harness/gitness/registry/app/api/openapi/contracts/artifact"
"github.com/harness/gitness/types"
"github.com/harness/gitness/types/enum"
"github.com/rs/zerolog/log"
)
func (c *APIController) DeleteArtifactVersion(ctx context.Context, r artifact.DeleteArtifactVersionRequestObject) (
artifact.DeleteArtifactVersionResponseObject, error) {
regInfo, err := c.GetRegistryRequestBaseInfo(ctx, "", string(r.RegistryRef))
if err != nil {
return artifact.DeleteArtifactVersion400JSONResponse{
BadRequestJSONResponse: artifact.BadRequestJSONResponse(
*GetErrorResponse(http.StatusBadRequest, err.Error()),
),
}, err
}
space, err := c.SpaceStore.FindByRef(ctx, regInfo.ParentRef)
if err != nil {
return artifact.DeleteArtifactVersion400JSONResponse{
BadRequestJSONResponse: artifact.BadRequestJSONResponse(
*GetErrorResponse(http.StatusBadRequest, err.Error()),
),
}, err
}
session, _ := request.AuthSessionFrom(ctx)
if err = apiauth.CheckSpaceScope(
ctx,
c.Authorizer,
session,
space,
enum.ResourceTypeRegistry,
enum.PermissionArtifactsDelete,
); err != nil {
return artifact.DeleteArtifactVersion403JSONResponse{
UnauthorizedJSONResponse: artifact.UnauthorizedJSONResponse(
*GetErrorResponse(http.StatusForbidden, err.Error()),
),
}, err
}
repoEntity, err := c.RegistryRepository.GetByParentIDAndName(ctx, regInfo.parentID, regInfo.RegistryIdentifier)
if len(repoEntity.Name) == 0 {
return artifact.DeleteArtifactVersion404JSONResponse{
NotFoundJSONResponse: artifact.NotFoundJSONResponse(
*GetErrorResponse(http.StatusNotFound, "registry doesn't exist with this key"),
),
}, nil
}
if err != nil {
return throwDeleteArtifactVersion500Error(err), err
}
err = c.deleteTagWithAudit(ctx, regInfo, repoEntity.Name, session.Principal, string(r.Artifact),
string(r.Version))
if err != nil {
return throwDeleteArtifactVersion500Error(err), err
}
return artifact.DeleteArtifactVersion200JSONResponse{
SuccessJSONResponse: artifact.SuccessJSONResponse(*GetSuccessResponse()),
}, nil
}
func (c *APIController) deleteTagWithAudit(
ctx context.Context, regInfo *RegistryRequestBaseInfo,
registryName string, principal types.Principal, artifactName string, versionName string) error {
err := c.TagStore.DeleteTag(ctx, regInfo.RegistryID, artifactName, versionName)
if err != nil {
return err
}
auditErr := c.AuditService.Log(
ctx,
principal,
audit.NewResource(audit.ResourceTypeRegistry, artifactName),
audit.ActionDeleted,
regInfo.ParentRef,
audit.WithData("registry name", registryName),
audit.WithData("artifact name", artifactName),
audit.WithData("version name", versionName),
)
if auditErr != nil {
log.Ctx(ctx).Warn().Msgf("failed to insert audit log for delete tag operation: %s", auditErr)
}
return err
}
func throwDeleteArtifactVersion500Error(err error) artifact.DeleteArtifactVersion500JSONResponse {
return artifact.DeleteArtifactVersion500JSONResponse{
InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
*GetErrorResponse(http.StatusInternalServerError, err.Error()),
),
}
}

View File

@ -294,6 +294,53 @@ paths:
$ref: "#/components/responses/NotFound" $ref: "#/components/responses/NotFound"
500: 500:
$ref: "#/components/responses/InternalServerError" $ref: "#/components/responses/InternalServerError"
/registry/{registry_ref}/artifact/{artifact}:
delete:
summary: Delete Artifact
description: Delete Artifact.
operationId: DeleteArtifact
tags:
- Artifacts
parameters:
- $ref: "#/components/parameters/registryRefPathParam"
- $ref: "#/components/parameters/artifactPathParam"
responses:
200:
$ref: "#/components/responses/Success"
400:
$ref: "#/components/responses/BadRequest"
401:
$ref: "#/components/responses/Unauthenticated"
403:
$ref: "#/components/responses/Unauthorized"
404:
$ref: "#/components/responses/NotFound"
500:
$ref: "#/components/responses/InternalServerError"
/registry/{registry_ref}/artifact/{artifact}/version/{version}:
delete:
summary: Delete an Artifact Version
description: Delete Artifact Version.
operationId: DeleteArtifactVersion
tags:
- Artifacts
parameters:
- $ref: "#/components/parameters/registryRefPathParam"
- $ref: "#/components/parameters/artifactPathParam"
- $ref: "#/components/parameters/versionPathParam"
responses:
200:
$ref: "#/components/responses/Success"
400:
$ref: "#/components/responses/BadRequest"
401:
$ref: "#/components/responses/Unauthenticated"
403:
$ref: "#/components/responses/Unauthorized"
404:
$ref: "#/components/responses/NotFound"
500:
$ref: "#/components/responses/InternalServerError"
/registry/{registry_ref}/artifact/{artifact}/summary: /registry/{registry_ref}/artifact/{artifact}/summary:
get: get:
summary: Get Artifact Summary summary: Get Artifact Summary

View File

@ -41,6 +41,9 @@ type ServerInterface interface {
// Get Artifact Stats // Get Artifact Stats
// (GET /registry/{registry_ref}/artifact/stats) // (GET /registry/{registry_ref}/artifact/stats)
GetArtifactStatsForRegistry(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, params GetArtifactStatsForRegistryParams) GetArtifactStatsForRegistry(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, params GetArtifactStatsForRegistryParams)
// Delete Artifact
// (DELETE /registry/{registry_ref}/artifact/{artifact})
DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam)
// Update Artifact Labels // Update Artifact Labels
// (PUT /registry/{registry_ref}/artifact/{artifact}/labels) // (PUT /registry/{registry_ref}/artifact/{artifact}/labels)
UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam)
@ -50,6 +53,9 @@ type ServerInterface interface {
// Get Artifact Summary // Get Artifact Summary
// (GET /registry/{registry_ref}/artifact/{artifact}/summary) // (GET /registry/{registry_ref}/artifact/{artifact}/summary)
GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam)
// Delete an Artifact Version
// (DELETE /registry/{registry_ref}/artifact/{artifact}/version/{version})
DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam)
// Describe Docker Artifact Detail // Describe Docker Artifact Detail
// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details) // (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details)
GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetDockerArtifactDetailsParams) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetDockerArtifactDetailsParams)
@ -131,6 +137,12 @@ func (_ Unimplemented) GetArtifactStatsForRegistry(w http.ResponseWriter, r *htt
w.WriteHeader(http.StatusNotImplemented) w.WriteHeader(http.StatusNotImplemented)
} }
// Delete Artifact
// (DELETE /registry/{registry_ref}/artifact/{artifact})
func (_ Unimplemented) DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
w.WriteHeader(http.StatusNotImplemented)
}
// Update Artifact Labels // Update Artifact Labels
// (PUT /registry/{registry_ref}/artifact/{artifact}/labels) // (PUT /registry/{registry_ref}/artifact/{artifact}/labels)
func (_ Unimplemented) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) { func (_ Unimplemented) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
@ -149,6 +161,12 @@ func (_ Unimplemented) GetArtifactSummary(w http.ResponseWriter, r *http.Request
w.WriteHeader(http.StatusNotImplemented) w.WriteHeader(http.StatusNotImplemented)
} }
// Delete an Artifact Version
// (DELETE /registry/{registry_ref}/artifact/{artifact}/version/{version})
func (_ Unimplemented) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam) {
w.WriteHeader(http.StatusNotImplemented)
}
// Describe Docker Artifact Detail // Describe Docker Artifact Detail
// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details) // (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details)
func (_ Unimplemented) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetDockerArtifactDetailsParams) { func (_ Unimplemented) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetDockerArtifactDetailsParams) {
@ -440,6 +458,41 @@ func (siw *ServerInterfaceWrapper) GetArtifactStatsForRegistry(w http.ResponseWr
handler.ServeHTTP(w, r.WithContext(ctx)) handler.ServeHTTP(w, r.WithContext(ctx))
} }
// DeleteArtifact operation middleware
func (siw *ServerInterfaceWrapper) DeleteArtifact(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
var err error
// ------------- Path parameter "registry_ref" -------------
var registryRef RegistryRefPathParam
err = runtime.BindStyledParameterWithOptions("simple", "registry_ref", chi.URLParam(r, "registry_ref"), &registryRef, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "registry_ref", Err: err})
return
}
// ------------- Path parameter "artifact" -------------
var artifact ArtifactPathParam
err = runtime.BindStyledParameterWithOptions("simple", "artifact", chi.URLParam(r, "artifact"), &artifact, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact", Err: err})
return
}
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.DeleteArtifact(w, r, registryRef, artifact)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r.WithContext(ctx))
}
// UpdateArtifactLabels operation middleware // UpdateArtifactLabels operation middleware
func (siw *ServerInterfaceWrapper) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request) { func (siw *ServerInterfaceWrapper) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
@ -564,6 +617,50 @@ func (siw *ServerInterfaceWrapper) GetArtifactSummary(w http.ResponseWriter, r *
handler.ServeHTTP(w, r.WithContext(ctx)) handler.ServeHTTP(w, r.WithContext(ctx))
} }
// DeleteArtifactVersion operation middleware
func (siw *ServerInterfaceWrapper) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
var err error
// ------------- Path parameter "registry_ref" -------------
var registryRef RegistryRefPathParam
err = runtime.BindStyledParameterWithOptions("simple", "registry_ref", chi.URLParam(r, "registry_ref"), &registryRef, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "registry_ref", Err: err})
return
}
// ------------- Path parameter "artifact" -------------
var artifact ArtifactPathParam
err = runtime.BindStyledParameterWithOptions("simple", "artifact", chi.URLParam(r, "artifact"), &artifact, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact", Err: err})
return
}
// ------------- Path parameter "version" -------------
var version VersionPathParam
err = runtime.BindStyledParameterWithOptions("simple", "version", chi.URLParam(r, "version"), &version, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "version", Err: err})
return
}
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.DeleteArtifactVersion(w, r, registryRef, artifact, version)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r.WithContext(ctx))
}
// GetDockerArtifactDetails operation middleware // GetDockerArtifactDetails operation middleware
func (siw *ServerInterfaceWrapper) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request) { func (siw *ServerInterfaceWrapper) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
@ -1472,6 +1569,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
r.Get(options.BaseURL+"/registry/{registry_ref}/artifact/stats", wrapper.GetArtifactStatsForRegistry) r.Get(options.BaseURL+"/registry/{registry_ref}/artifact/stats", wrapper.GetArtifactStatsForRegistry)
}) })
r.Group(func(r chi.Router) {
r.Delete(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}", wrapper.DeleteArtifact)
})
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
r.Put(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/labels", wrapper.UpdateArtifactLabels) r.Put(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/labels", wrapper.UpdateArtifactLabels)
}) })
@ -1481,6 +1581,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
r.Get(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/summary", wrapper.GetArtifactSummary) r.Get(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/summary", wrapper.GetArtifactSummary)
}) })
r.Group(func(r chi.Router) {
r.Delete(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/version/{version}", wrapper.DeleteArtifactVersion)
})
r.Group(func(r chi.Router) { r.Group(func(r chi.Router) {
r.Get(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details", wrapper.GetDockerArtifactDetails) r.Get(options.BaseURL+"/registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details", wrapper.GetDockerArtifactDetails)
}) })
@ -2058,6 +2161,71 @@ func (response GetArtifactStatsForRegistry500JSONResponse) VisitGetArtifactStats
return json.NewEncoder(w).Encode(response) return json.NewEncoder(w).Encode(response)
} }
type DeleteArtifactRequestObject struct {
RegistryRef RegistryRefPathParam `json:"registry_ref"`
Artifact ArtifactPathParam `json:"artifact"`
}
type DeleteArtifactResponseObject interface {
VisitDeleteArtifactResponse(w http.ResponseWriter) error
}
type DeleteArtifact200JSONResponse struct{ SuccessJSONResponse }
func (response DeleteArtifact200JSONResponse) VisitDeleteArtifactResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(200)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifact400JSONResponse struct{ BadRequestJSONResponse }
func (response DeleteArtifact400JSONResponse) VisitDeleteArtifactResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(400)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifact401JSONResponse struct{ UnauthenticatedJSONResponse }
func (response DeleteArtifact401JSONResponse) VisitDeleteArtifactResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(401)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifact403JSONResponse struct{ UnauthorizedJSONResponse }
func (response DeleteArtifact403JSONResponse) VisitDeleteArtifactResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(403)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifact404JSONResponse struct{ NotFoundJSONResponse }
func (response DeleteArtifact404JSONResponse) VisitDeleteArtifactResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(404)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifact500JSONResponse struct {
InternalServerErrorJSONResponse
}
func (response DeleteArtifact500JSONResponse) VisitDeleteArtifactResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(500)
return json.NewEncoder(w).Encode(response)
}
type UpdateArtifactLabelsRequestObject struct { type UpdateArtifactLabelsRequestObject struct {
RegistryRef RegistryRefPathParam `json:"registry_ref"` RegistryRef RegistryRefPathParam `json:"registry_ref"`
Artifact ArtifactPathParam `json:"artifact"` Artifact ArtifactPathParam `json:"artifact"`
@ -2261,6 +2429,72 @@ func (response GetArtifactSummary500JSONResponse) VisitGetArtifactSummaryRespons
return json.NewEncoder(w).Encode(response) return json.NewEncoder(w).Encode(response)
} }
type DeleteArtifactVersionRequestObject struct {
RegistryRef RegistryRefPathParam `json:"registry_ref"`
Artifact ArtifactPathParam `json:"artifact"`
Version VersionPathParam `json:"version"`
}
type DeleteArtifactVersionResponseObject interface {
VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error
}
type DeleteArtifactVersion200JSONResponse struct{ SuccessJSONResponse }
func (response DeleteArtifactVersion200JSONResponse) VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(200)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifactVersion400JSONResponse struct{ BadRequestJSONResponse }
func (response DeleteArtifactVersion400JSONResponse) VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(400)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifactVersion401JSONResponse struct{ UnauthenticatedJSONResponse }
func (response DeleteArtifactVersion401JSONResponse) VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(401)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifactVersion403JSONResponse struct{ UnauthorizedJSONResponse }
func (response DeleteArtifactVersion403JSONResponse) VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(403)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifactVersion404JSONResponse struct{ NotFoundJSONResponse }
func (response DeleteArtifactVersion404JSONResponse) VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(404)
return json.NewEncoder(w).Encode(response)
}
type DeleteArtifactVersion500JSONResponse struct {
InternalServerErrorJSONResponse
}
func (response DeleteArtifactVersion500JSONResponse) VisitDeleteArtifactVersionResponse(w http.ResponseWriter) error {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(500)
return json.NewEncoder(w).Encode(response)
}
type GetDockerArtifactDetailsRequestObject struct { type GetDockerArtifactDetailsRequestObject struct {
RegistryRef RegistryRefPathParam `json:"registry_ref"` RegistryRef RegistryRefPathParam `json:"registry_ref"`
Artifact ArtifactPathParam `json:"artifact"` Artifact ArtifactPathParam `json:"artifact"`
@ -3163,6 +3397,9 @@ type StrictServerInterface interface {
// Get Artifact Stats // Get Artifact Stats
// (GET /registry/{registry_ref}/artifact/stats) // (GET /registry/{registry_ref}/artifact/stats)
GetArtifactStatsForRegistry(ctx context.Context, request GetArtifactStatsForRegistryRequestObject) (GetArtifactStatsForRegistryResponseObject, error) GetArtifactStatsForRegistry(ctx context.Context, request GetArtifactStatsForRegistryRequestObject) (GetArtifactStatsForRegistryResponseObject, error)
// Delete Artifact
// (DELETE /registry/{registry_ref}/artifact/{artifact})
DeleteArtifact(ctx context.Context, request DeleteArtifactRequestObject) (DeleteArtifactResponseObject, error)
// Update Artifact Labels // Update Artifact Labels
// (PUT /registry/{registry_ref}/artifact/{artifact}/labels) // (PUT /registry/{registry_ref}/artifact/{artifact}/labels)
UpdateArtifactLabels(ctx context.Context, request UpdateArtifactLabelsRequestObject) (UpdateArtifactLabelsResponseObject, error) UpdateArtifactLabels(ctx context.Context, request UpdateArtifactLabelsRequestObject) (UpdateArtifactLabelsResponseObject, error)
@ -3172,6 +3409,9 @@ type StrictServerInterface interface {
// Get Artifact Summary // Get Artifact Summary
// (GET /registry/{registry_ref}/artifact/{artifact}/summary) // (GET /registry/{registry_ref}/artifact/{artifact}/summary)
GetArtifactSummary(ctx context.Context, request GetArtifactSummaryRequestObject) (GetArtifactSummaryResponseObject, error) GetArtifactSummary(ctx context.Context, request GetArtifactSummaryRequestObject) (GetArtifactSummaryResponseObject, error)
// Delete an Artifact Version
// (DELETE /registry/{registry_ref}/artifact/{artifact}/version/{version})
DeleteArtifactVersion(ctx context.Context, request DeleteArtifactVersionRequestObject) (DeleteArtifactVersionResponseObject, error)
// Describe Docker Artifact Detail // Describe Docker Artifact Detail
// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details) // (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/docker/details)
GetDockerArtifactDetails(ctx context.Context, request GetDockerArtifactDetailsRequestObject) (GetDockerArtifactDetailsResponseObject, error) GetDockerArtifactDetails(ctx context.Context, request GetDockerArtifactDetailsRequestObject) (GetDockerArtifactDetailsResponseObject, error)
@ -3414,6 +3654,33 @@ func (sh *strictHandler) GetArtifactStatsForRegistry(w http.ResponseWriter, r *h
} }
} }
// DeleteArtifact operation middleware
func (sh *strictHandler) DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
var request DeleteArtifactRequestObject
request.RegistryRef = registryRef
request.Artifact = artifact
handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
return sh.ssi.DeleteArtifact(ctx, request.(DeleteArtifactRequestObject))
}
for _, middleware := range sh.middlewares {
handler = middleware(handler, "DeleteArtifact")
}
response, err := handler(r.Context(), w, r, request)
if err != nil {
sh.options.ResponseErrorHandlerFunc(w, r, err)
} else if validResponse, ok := response.(DeleteArtifactResponseObject); ok {
if err := validResponse.VisitDeleteArtifactResponse(w); err != nil {
sh.options.ResponseErrorHandlerFunc(w, r, err)
}
} else if response != nil {
sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response))
}
}
// UpdateArtifactLabels operation middleware // UpdateArtifactLabels operation middleware
func (sh *strictHandler) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) { func (sh *strictHandler) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
var request UpdateArtifactLabelsRequestObject var request UpdateArtifactLabelsRequestObject
@ -3503,6 +3770,34 @@ func (sh *strictHandler) GetArtifactSummary(w http.ResponseWriter, r *http.Reque
} }
} }
// DeleteArtifactVersion operation middleware
func (sh *strictHandler) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam) {
var request DeleteArtifactVersionRequestObject
request.RegistryRef = registryRef
request.Artifact = artifact
request.Version = version
handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
return sh.ssi.DeleteArtifactVersion(ctx, request.(DeleteArtifactVersionRequestObject))
}
for _, middleware := range sh.middlewares {
handler = middleware(handler, "DeleteArtifactVersion")
}
response, err := handler(r.Context(), w, r, request)
if err != nil {
sh.options.ResponseErrorHandlerFunc(w, r, err)
} else if validResponse, ok := response.(DeleteArtifactVersionResponseObject); ok {
if err := validResponse.VisitDeleteArtifactVersionResponse(w); err != nil {
sh.options.ResponseErrorHandlerFunc(w, r, err)
}
} else if response != nil {
sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response))
}
}
// GetDockerArtifactDetails operation middleware // GetDockerArtifactDetails operation middleware
func (sh *strictHandler) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetDockerArtifactDetailsParams) { func (sh *strictHandler) GetDockerArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetDockerArtifactDetailsParams) {
var request GetDockerArtifactDetailsRequestObject var request GetDockerArtifactDetailsRequestObject
@ -3868,70 +4163,71 @@ func (sh *strictHandler) GetAllRegistries(w http.ResponseWriter, r *http.Request
// Base64 encoded, gzipped, json marshaled Swagger object // Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{ var swaggerSpec = []string{
"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",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file

View File

@ -131,6 +131,7 @@ type ManifestRepository interface {
ctx context.Context, repoID int64, ctx context.Context, repoID int64,
digest types.Digest, digest types.Digest,
) (types.Manifests, error) ) (types.Manifests, error)
DeleteManifestsByImageName(ctx context.Context, registryID int64, imageName string) (err error)
} }
type ManifestReferenceRepository interface { type ManifestReferenceRepository interface {
@ -246,6 +247,8 @@ type TagRepository interface {
search string, search string,
) (*[]types.TagMetadata, error) ) (*[]types.TagMetadata, error)
DeleteTag(ctx context.Context, registryID int64, imageName string, name string) (err error)
CountAllTagsByRepoAndImage( CountAllTagsByRepoAndImage(
ctx context.Context, parentID int64, repoKey string, ctx context.Context, parentID int64, repoKey string,
image string, search string, image string, search string,
@ -418,6 +421,8 @@ type ImageRepository interface {
CreateOrUpdate(ctx context.Context, image *types.Image) error CreateOrUpdate(ctx context.Context, image *types.Image) error
// Update an Artifact // Update an Artifact
Update(ctx context.Context, artifact *types.Image) (err error) Update(ctx context.Context, artifact *types.Image) (err error)
UpdateStatus(ctx context.Context, artifact *types.Image) (err error)
} }
type ArtifactRepository interface { type ArtifactRepository interface {

View File

@ -245,6 +245,36 @@ func (i ImageDao) Update(ctx context.Context, image *types.Image) (err error) {
return nil return nil
} }
func (i ImageDao) UpdateStatus(ctx context.Context, image *types.Image) (err error) {
q := databaseg.Builder.Update("images").
Set("image_enabled", image.Enabled).
Set("image_updated_at", time.Now().UnixMilli()).
Where("image_registry_id = ? AND image_name = ?",
image.RegistryID, image.Name)
sql, args, err := q.ToSql()
if err != nil {
return databaseg.ProcessSQLErrorf(ctx, err, "Failed to bind images object")
}
result, err := i.db.ExecContext(ctx, sql, args...)
if err != nil {
return databaseg.ProcessSQLErrorf(ctx, err, "Failed to update images")
}
count, err := result.RowsAffected()
if err != nil {
return databaseg.ProcessSQLErrorf(ctx, err, "Failed to get number of updated rows")
}
if count == 0 {
return gitness_store.ErrVersionConflict
}
return nil
}
func (i ImageDao) mapToInternalImage(ctx context.Context, in *types.Image) *imageDB { func (i ImageDao) mapToInternalImage(ctx context.Context, in *types.Image) *imageDB {
session, _ := request.AuthSessionFrom(ctx) session, _ := request.AuthSessionFrom(ctx)

View File

@ -388,6 +388,27 @@ func (dao manifestDao) DeleteManifest(
return count == 1, nil return count == 1, nil
} }
func (dao manifestDao) DeleteManifestsByImageName(ctx context.Context, registryID int64,
imageName string) (err error) {
stmt := database.Builder.Delete("manifests").
Where(
"manifest_registry_id = ? AND manifest_image_name = ?", registryID, imageName)
toSQL, args, err := stmt.ToSql()
if err != nil {
return fmt.Errorf("failed to convert manifest query to sql: %w", err)
}
db := dbtx.GetAccessor(ctx, dao.sqlDB)
_, err = db.ExecContext(ctx, toSQL, args...)
if err != nil {
return database.ProcessSQLErrorf(ctx, err, "the delete query failed")
}
return nil
}
func (dao manifestDao) FindManifestByID( func (dao manifestDao) FindManifestByID(
ctx context.Context, ctx context.Context,
registryID, registryID,

View File

@ -484,6 +484,24 @@ func (t tagDao) GetTagDetail(
return t.mapToTagDetail(ctx, dst) return t.mapToTagDetail(ctx, dst)
} }
func (t tagDao) DeleteTag(ctx context.Context, registryID int64, imageName string, name string) (err error) {
stmt := databaseg.Builder.Delete("tags").
Where("tag_registry_id = ? AND tag_image_name = ? AND tag_name = ?", registryID, imageName, name)
sql, args, err := stmt.ToSql()
if err != nil {
return fmt.Errorf("failed to convert purge tags query to sql: %w", err)
}
db := dbtx.GetAccessor(ctx, t.db)
_, err = db.ExecContext(ctx, sql, args...)
if err != nil {
return databaseg.ProcessSQLErrorf(ctx, err, "the delete query failed")
}
return nil
}
func (t tagDao) GetLatestTagMetadata( func (t tagDao) GetLatestTagMetadata(
ctx context.Context, ctx context.Context,
parentID int64, parentID int64,