Initial support for custom labels and annotations

This commit is contained in:
Finn Herzfeld
2020-03-24 11:38:55 -07:00
committed by stefanprodan
parent b564a2fda2
commit 9d907deece
6 changed files with 170 additions and 6 deletions

View File

@@ -499,6 +499,42 @@ spec:
format: string
type: string
type: array
apex:
description: Metadata to add to the apex service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
primary:
description: Metadata to add to the primary service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
canary:
description: Metadata to add to the canary service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
skipAnalysis:
description: Skip analysis and promote canary
type: boolean

View File

@@ -499,6 +499,42 @@ spec:
format: string
type: string
type: array
apex:
description: Metadata to add to the apex service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
primary:
description: Metadata to add to the primary service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
canary:
description: Metadata to add to the canary service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
skipAnalysis:
description: Skip analysis and promote canary
type: boolean

View File

@@ -499,6 +499,42 @@ spec:
format: string
type: string
type: array
apex:
description: Metadata to add to the apex service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
primary:
description: Metadata to add to the primary service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
canary:
description: Metadata to add to the canary service
type: object
properties:
labels:
type: object
additionalProperties:
type: string
annotations:
type: object
additionalProperties:
type: string
skipAnalysis:
description: Skip analysis and promote canary
type: boolean

View File

@@ -168,6 +168,18 @@ type CanaryService struct {
// Backends of the generated App Mesh virtual nodes
// +optional
Backends []string `json:"backends,omitempty"`
// Apex is metadata to add to the apex service
// +optional
Apex CustomMetadata `json:"apex,omitempty"`
// Primary is the metadata to add to the primary service
// +optional
Primary CustomMetadata `json:"primary,omitempty"`
// Canary is the metadata to add to the canary service
// +optional
Canary CustomMetadata `json:"canary,omitempty"`
}
// CanaryAnalysis is used to describe how the analysis should be done
@@ -343,6 +355,12 @@ type CrossNamespaceObjectReference struct {
Namespace string `json:"namespace,omitempty"`
}
// CustomMetadata holds labels and annotations to set on generated objects.
type CustomMetadata struct {
Labels map[string]string `json:"labels,omitempty"`
Annotations map[string]string `json:"annotations,omitempty"`
}
// GetServiceNames returns the apex, primary and canary Kubernetes service names
func (c *Canary) GetServiceNames() (apexName, primaryName, canaryName string) {
apexName = c.Spec.TargetRef.Name

View File

@@ -364,6 +364,9 @@ func (in *CanaryService) DeepCopyInto(out *CanaryService) {
*out = make([]string, len(*in))
copy(*out, *in)
}
in.Apex.DeepCopyInto(&out.Apex)
in.Primary.DeepCopyInto(&out.Primary)
in.Canary.DeepCopyInto(&out.Canary)
return
}
@@ -547,6 +550,36 @@ func (in *CrossNamespaceObjectReference) DeepCopy() *CrossNamespaceObjectReferen
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CustomMetadata) DeepCopyInto(out *CustomMetadata) {
*out = *in
if in.Labels != nil {
in, out := &in.Labels, &out.Labels
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
if in.Annotations != nil {
in, out := &in.Annotations, &out.Annotations
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomMetadata.
func (in *CustomMetadata) DeepCopy() *CustomMetadata {
if in == nil {
return nil
}
out := new(CustomMetadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MetricTemplate) DeepCopyInto(out *MetricTemplate) {
*out = *in

View File

@@ -34,13 +34,13 @@ func (c *KubernetesDefaultRouter) Initialize(canary *flaggerv1.Canary) error {
_, primaryName, canaryName := canary.GetServiceNames()
// canary svc
err := c.reconcileService(canary, canaryName, canary.Spec.TargetRef.Name)
err := c.reconcileService(canary, canaryName, canary.Spec.TargetRef.Name, canary.Spec.Service.Canary)
if err != nil {
return fmt.Errorf("reconcileService failed: %w", err)
}
// primary svc
err = c.reconcileService(canary, primaryName, fmt.Sprintf("%s-primary", canary.Spec.TargetRef.Name))
err = c.reconcileService(canary, primaryName, fmt.Sprintf("%s-primary", canary.Spec.TargetRef.Name), canary.Spec.Service.Primary)
if err != nil {
return fmt.Errorf("reconcileService failed: %w", err)
}
@@ -53,7 +53,7 @@ func (c *KubernetesDefaultRouter) Reconcile(canary *flaggerv1.Canary) error {
apexName, _, _ := canary.GetServiceNames()
// main svc
err := c.reconcileService(canary, apexName, fmt.Sprintf("%s-primary", canary.Spec.TargetRef.Name))
err := c.reconcileService(canary, apexName, fmt.Sprintf("%s-primary", canary.Spec.TargetRef.Name), canary.Spec.Service.Apex)
if err != nil {
return fmt.Errorf("reconcileService failed: %w", err)
}
@@ -69,7 +69,7 @@ func (c *KubernetesDefaultRouter) GetRoutes(_ *flaggerv1.Canary) (primaryRoute i
return 0, 0, nil
}
func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, name string, podSelector string) error {
func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, name string, podSelector string, metadata flaggerv1.CustomMetadata) error {
portName := canary.Spec.Service.PortName
if portName == "" {
portName = "http"
@@ -113,6 +113,11 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam
svcSpec.Ports = append(svcSpec.Ports, cp)
}
metadata.Labels[c.labelSelector] = name
for k, v := range c.annotations {
metadata.Annotations[k] = v
}
// create service if it doesn't exists
svc, err := c.kubeClient.CoreV1().Services(canary.Namespace).Get(context.TODO(), name, metav1.GetOptions{})
if errors.IsNotFound(err) {
@@ -120,8 +125,8 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: canary.Namespace,
Labels: map[string]string{c.labelSelector: name},
Annotations: c.annotations,
Labels: metadata.Labels,
Annotations: metadata.Annotations,
OwnerReferences: []metav1.OwnerReference{
*metav1.NewControllerRef(canary, schema.GroupVersionKind{
Group: flaggerv1.SchemeGroupVersion.Group,