mirror of
https://github.com/goharbor/harbor.git
synced 2024-09-27 13:02:59 +02:00
feat: enhance the replication webhook payload (#19433)
Add the new filed 'references' to the replication webhook payload, which can help user better know the replicated artifact tags or digests. (references is the lists of the artifact tag name or digest if no tag) Signed-off-by: chlins <chenyuzh@vmware.com>
This commit is contained in:
parent
322dce5272
commit
99b40bf764
@ -191,6 +191,7 @@ func constructReplicationPayload(ctx context.Context, event *event.ReplicationEv
|
|||||||
Type: task.ResourceType,
|
Type: task.ResourceType,
|
||||||
Status: task.Status,
|
Status: task.Status,
|
||||||
NameAndTag: nameAndTag,
|
NameAndTag: nameAndTag,
|
||||||
|
References: strings.Split(task.References, ","),
|
||||||
}
|
}
|
||||||
payload.EventData.Replication.SuccessfulArtifact = []*ctlModel.ArtifactInfo{succeedArtifact}
|
payload.EventData.Replication.SuccessfulArtifact = []*ctlModel.ArtifactInfo{succeedArtifact}
|
||||||
}
|
}
|
||||||
@ -199,6 +200,7 @@ func constructReplicationPayload(ctx context.Context, event *event.ReplicationEv
|
|||||||
Type: task.ResourceType,
|
Type: task.ResourceType,
|
||||||
Status: task.Status,
|
Status: task.Status,
|
||||||
NameAndTag: nameAndTag,
|
NameAndTag: nameAndTag,
|
||||||
|
References: strings.Split(task.References, ","),
|
||||||
}
|
}
|
||||||
payload.EventData.Replication.FailedArtifact = []*ctlModel.ArtifactInfo{failedArtifact}
|
payload.EventData.Replication.FailedArtifact = []*ctlModel.ArtifactInfo{failedArtifact}
|
||||||
}
|
}
|
||||||
|
@ -35,10 +35,11 @@ type Replication struct {
|
|||||||
|
|
||||||
// ArtifactInfo describe info of artifact
|
// ArtifactInfo describe info of artifact
|
||||||
type ArtifactInfo struct {
|
type ArtifactInfo struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
NameAndTag string `json:"name_tag"`
|
NameAndTag string `json:"name_tag"`
|
||||||
FailReason string `json:"fail_reason,omitempty"`
|
References []string `json:"references"`
|
||||||
|
FailReason string `json:"fail_reason,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReplicationResource describes replication resource info
|
// ReplicationResource describes replication resource info
|
||||||
|
@ -296,6 +296,7 @@ func convertTask(task *task.Task) *Task {
|
|||||||
ResourceType: task.GetStringFromExtraAttrs("resource_type"),
|
ResourceType: task.GetStringFromExtraAttrs("resource_type"),
|
||||||
SourceResource: task.GetStringFromExtraAttrs("source_resource"),
|
SourceResource: task.GetStringFromExtraAttrs("source_resource"),
|
||||||
DestinationResource: task.GetStringFromExtraAttrs("destination_resource"),
|
DestinationResource: task.GetStringFromExtraAttrs("destination_resource"),
|
||||||
|
References: task.GetStringFromExtraAttrs("references"),
|
||||||
Operation: task.GetStringFromExtraAttrs("operation"),
|
Operation: task.GetStringFromExtraAttrs("operation"),
|
||||||
JobID: task.JobID,
|
JobID: task.JobID,
|
||||||
CreationTime: task.CreationTime,
|
CreationTime: task.CreationTime,
|
||||||
|
@ -199,6 +199,7 @@ func (r *replicationTestSuite) TestListTasks() {
|
|||||||
"resource_type": "artifact",
|
"resource_type": "artifact",
|
||||||
"source_resource": "library/hello-world",
|
"source_resource": "library/hello-world",
|
||||||
"destination_resource": "library/hello-world",
|
"destination_resource": "library/hello-world",
|
||||||
|
"references": "v1,v2,v3",
|
||||||
"operation": "copy",
|
"operation": "copy",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -211,6 +212,7 @@ func (r *replicationTestSuite) TestListTasks() {
|
|||||||
r.Equal("artifact", tasks[0].ResourceType)
|
r.Equal("artifact", tasks[0].ResourceType)
|
||||||
r.Equal("library/hello-world", tasks[0].SourceResource)
|
r.Equal("library/hello-world", tasks[0].SourceResource)
|
||||||
r.Equal("library/hello-world", tasks[0].DestinationResource)
|
r.Equal("library/hello-world", tasks[0].DestinationResource)
|
||||||
|
r.Equal("v1,v2,v3", tasks[0].References)
|
||||||
r.Equal("copy", tasks[0].Operation)
|
r.Equal("copy", tasks[0].Operation)
|
||||||
r.taskMgr.AssertExpectations(r.T())
|
r.taskMgr.AssertExpectations(r.T())
|
||||||
}
|
}
|
||||||
@ -225,6 +227,7 @@ func (r *replicationTestSuite) TestGetTask() {
|
|||||||
"resource_type": "artifact",
|
"resource_type": "artifact",
|
||||||
"source_resource": "library/hello-world",
|
"source_resource": "library/hello-world",
|
||||||
"destination_resource": "library/hello-world",
|
"destination_resource": "library/hello-world",
|
||||||
|
"references": "v1,v2,v3",
|
||||||
"operation": "copy",
|
"operation": "copy",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -236,6 +239,7 @@ func (r *replicationTestSuite) TestGetTask() {
|
|||||||
r.Equal("artifact", task.ResourceType)
|
r.Equal("artifact", task.ResourceType)
|
||||||
r.Equal("library/hello-world", task.SourceResource)
|
r.Equal("library/hello-world", task.SourceResource)
|
||||||
r.Equal("library/hello-world", task.DestinationResource)
|
r.Equal("library/hello-world", task.DestinationResource)
|
||||||
|
r.Equal("v1,v2,v3", task.References)
|
||||||
r.Equal("copy", task.Operation)
|
r.Equal("copy", task.Operation)
|
||||||
r.taskMgr.AssertExpectations(r.T())
|
r.taskMgr.AssertExpectations(r.T())
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,8 @@ func (c *copyFlow) createTasks(ctx context.Context, srcResources, dstResources [
|
|||||||
"operation": "copy",
|
"operation": "copy",
|
||||||
"resource_type": string(srcResource.Type),
|
"resource_type": string(srcResource.Type),
|
||||||
"source_resource": getResourceName(srcResource),
|
"source_resource": getResourceName(srcResource),
|
||||||
"destination_resource": getResourceName(dstResource)}); err != nil {
|
"destination_resource": getResourceName(dstResource),
|
||||||
|
"references": getResourceReferences(dstResource)}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,8 @@ func (d *deletionFlow) createTasks(ctx context.Context, srcResources, dstResourc
|
|||||||
"operation": operation,
|
"operation": operation,
|
||||||
"resource_type": string(resource.Type),
|
"resource_type": string(resource.Type),
|
||||||
"source_resource": getResourceName(resource),
|
"source_resource": getResourceName(resource),
|
||||||
"destination_resource": getResourceName(dstResources[i])}); err != nil {
|
"destination_resource": getResourceName(dstResources[i]),
|
||||||
|
"references": getResourceReferences(dstResources[i])}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,6 +152,37 @@ func getResourceName(res *model.Resource) string {
|
|||||||
return fmt.Sprintf("%s [%d item(s) in total]", meta.Repository.Name, n)
|
return fmt.Sprintf("%s [%d item(s) in total]", meta.Repository.Name, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getResourceReferences gets the string lists of the resource reference, use tag name first or digest if no tag
|
||||||
|
// e.g v1,v2,dev,sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
|
||||||
|
func getResourceReferences(res *model.Resource) string {
|
||||||
|
if res == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
meta := res.Metadata
|
||||||
|
if meta == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
references := make([]string, 0)
|
||||||
|
if len(meta.Artifacts) > 0 {
|
||||||
|
for _, artifact := range meta.Artifacts {
|
||||||
|
// contains tags
|
||||||
|
if len(artifact.Tags) > 0 {
|
||||||
|
references = append(references, artifact.Tags...)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// contains no tag, use digest
|
||||||
|
if len(artifact.Digest) > 0 {
|
||||||
|
references = append(references, artifact.Digest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
references = append(references, meta.Vtags...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(references, ",")
|
||||||
|
}
|
||||||
|
|
||||||
// repository:a/b/c/image namespace:n replaceCount: -1 -> n/image
|
// repository:a/b/c/image namespace:n replaceCount: -1 -> n/image
|
||||||
// repository:a/b/c/image namespace:n replaceCount: 0 -> n/a/b/c/image
|
// repository:a/b/c/image namespace:n replaceCount: 0 -> n/a/b/c/image
|
||||||
// repository:a/b/c/image namespace:n replaceCount: 1 -> n/b/c/image
|
// repository:a/b/c/image namespace:n replaceCount: 1 -> n/b/c/image
|
||||||
|
@ -43,6 +43,7 @@ type Task struct {
|
|||||||
ResourceType string
|
ResourceType string
|
||||||
SourceResource string
|
SourceResource string
|
||||||
DestinationResource string
|
DestinationResource string
|
||||||
|
References string
|
||||||
Operation string
|
Operation string
|
||||||
JobID string
|
JobID string
|
||||||
CreationTime time.Time
|
CreationTime time.Time
|
||||||
|
Loading…
Reference in New Issue
Block a user