fix(edgestack): external label on k8s application deployed by edgestack [BE-12318] (#1385)

develop
Oscar Zhou 2025-11-21 12:44:42 +13:00 committed by GitHub
parent 6866faf4fe
commit 14d67d1ec7
5 changed files with 41 additions and 6 deletions

View File

@ -70,6 +70,13 @@ type (
// ReadyRePullImage is a flag to indicate whether the auto update is trigger to re-pull image // ReadyRePullImage is a flag to indicate whether the auto update is trigger to re-pull image
// Deprecated(2.36): use DeployerOptionsPayload.ForceRecreate instead // Deprecated(2.36): use DeployerOptionsPayload.ForceRecreate instead
ReadyRePullImage bool ReadyRePullImage bool
// CreatedBy is the username that created this stack
// Used for adding labels to Kubernetes manifests
CreatedBy string
// CreatedByUserId is the user ID that created this stack
// Used for adding labels to Kubernetes manifests
CreatedByUserId string
} }
DeployerOptionsPayload struct { DeployerOptionsPayload struct {

View File

@ -40,6 +40,7 @@ type K8sApplication struct {
Resource K8sApplicationResource `json:"Resource,omitempty"` Resource K8sApplicationResource `json:"Resource,omitempty"`
HorizontalPodAutoscaler *autoscalingv2.HorizontalPodAutoscaler `json:"HorizontalPodAutoscaler,omitempty" swaggerignore:"true"` HorizontalPodAutoscaler *autoscalingv2.HorizontalPodAutoscaler `json:"HorizontalPodAutoscaler,omitempty" swaggerignore:"true"`
CustomResourceMetadata CustomResourceMetadata `json:"CustomResourceMetadata,omitempty"` CustomResourceMetadata CustomResourceMetadata `json:"CustomResourceMetadata,omitempty"`
StackKind string `json:"StackKind,omitempty"`
} }
type Metadata struct { type Metadata struct {

View File

@ -13,11 +13,13 @@ import (
) )
const ( const (
labelPortainerAppStack = "io.portainer.kubernetes.application.stack" labelPortainerAppStack = "io.portainer.kubernetes.application.stack"
labelPortainerAppStackID = "io.portainer.kubernetes.application.stackid" labelPortainerAppStackID = "io.portainer.kubernetes.application.stackid"
labelPortainerAppName = "io.portainer.kubernetes.application.name" labelPortainerAppName = "io.portainer.kubernetes.application.name"
labelPortainerAppOwner = "io.portainer.kubernetes.application.owner" labelPortainerAppOwner = "io.portainer.kubernetes.application.owner"
labelPortainerAppKind = "io.portainer.kubernetes.application.kind" labelPortainerAppOwnerId = "io.portainer.kubernetes.application.owner.id"
labelPortainerAppKind = "io.portainer.kubernetes.application.kind"
labelPortainerAppStackKind = "io.portainer.kubernetes.application.stackKind"
) )
// KubeAppLabels are labels applied to all resources deployed in a kubernetes stack // KubeAppLabels are labels applied to all resources deployed in a kubernetes stack
@ -25,18 +27,28 @@ type KubeAppLabels struct {
StackID int StackID int
StackName string StackName string
Owner string Owner string
OwnerId string
Kind string Kind string
StackKind string
} }
// ToMap converts KubeAppLabels to a map[string]string // ToMap converts KubeAppLabels to a map[string]string
func (kal *KubeAppLabels) ToMap() map[string]string { func (kal *KubeAppLabels) ToMap() map[string]string {
return map[string]string{ labels := map[string]string{
labelPortainerAppStackID: strconv.Itoa(kal.StackID), labelPortainerAppStackID: strconv.Itoa(kal.StackID),
labelPortainerAppStack: stackutils.SanitizeLabel(kal.StackName), labelPortainerAppStack: stackutils.SanitizeLabel(kal.StackName),
labelPortainerAppName: stackutils.SanitizeLabel(kal.StackName), labelPortainerAppName: stackutils.SanitizeLabel(kal.StackName),
labelPortainerAppOwner: stackutils.SanitizeLabel(kal.Owner), labelPortainerAppOwner: stackutils.SanitizeLabel(kal.Owner),
labelPortainerAppKind: kal.Kind, labelPortainerAppKind: kal.Kind,
labelPortainerAppOwnerId: kal.OwnerId,
} }
// Add optional labels only if they are non-empty
if kal.StackKind != "" {
labels[labelPortainerAppStackKind] = kal.StackKind
}
return labels
} }
// GetHelmAppLabels returns the labels to be applied to portainer deployed helm applications // GetHelmAppLabels returns the labels to be applied to portainer deployed helm applications

View File

@ -40,6 +40,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: busybox name: busybox
@ -88,6 +89,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: busybox name: busybox
@ -177,6 +179,7 @@ items:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: web name: web
@ -198,6 +201,7 @@ items:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: redis name: redis
@ -221,6 +225,7 @@ items:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: web name: web
@ -303,6 +308,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: busybox name: busybox
@ -329,6 +335,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: web name: web
@ -348,6 +355,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: busybox name: busybox
@ -397,6 +405,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
name: web name: web
@ -619,6 +628,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
--- ---
@ -630,6 +640,7 @@ metadata:
io.portainer.kubernetes.application.kind: git io.portainer.kubernetes.application.kind: git
io.portainer.kubernetes.application.name: best-name io.portainer.kubernetes.application.name: best-name
io.portainer.kubernetes.application.owner: best-owner io.portainer.kubernetes.application.owner: best-owner
io.portainer.kubernetes.application.owner.id: ""
io.portainer.kubernetes.application.stack: best-name io.portainer.kubernetes.application.stack: best-name
io.portainer.kubernetes.application.stackid: "123" io.portainer.kubernetes.application.stackid: "123"
` `

View File

@ -347,6 +347,10 @@ type (
DeploymentType EdgeStackDeploymentType `json:"DeploymentType"` DeploymentType EdgeStackDeploymentType `json:"DeploymentType"`
// Uses the manifest's namespaces instead of the default one // Uses the manifest's namespaces instead of the default one
UseManifestNamespaces bool UseManifestNamespaces bool
// The username id which created this stack
CreatedByUserId string `example:"1"`
// The username which created this stack
CreatedBy string `example:"admin"`
} }
EdgeStackStatusForEnv struct { EdgeStackStatusForEnv struct {