-
Notifications
You must be signed in to change notification settings - Fork 132
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #498 from fluxcd/receiver-v1
GA: Promote Receiver API to `notification.toolkit.fluxcd.io/v1`
- Loading branch information
Showing
45 changed files
with
2,267 additions
and
210 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* | ||
Copyright 2023 The Flux authors | ||
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 v1 | ||
|
||
const NotificationFinalizer = "finalizers.fluxcd.io" | ||
|
||
const ( | ||
// InitializedReason represents the fact that a given resource has been initialized. | ||
InitializedReason string = "Initialized" | ||
|
||
// ValidationFailedReason represents the fact that some part of the spec of a given resource | ||
// couldn't be validated. | ||
ValidationFailedReason string = "ValidationFailed" | ||
|
||
// TokenNotFoundReason represents the fact that receiver token can't be found. | ||
TokenNotFoundReason string = "TokenNotFound" | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* | ||
Copyright 2023 The Flux authors | ||
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 v1 contains API Schema definitions for the notification v1 API group. | ||
// +kubebuilder:object:generate=true | ||
// +groupName=notification.toolkit.fluxcd.io | ||
package v1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* | ||
Copyright 2023 The Flux authors | ||
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 v1 | ||
|
||
import ( | ||
"k8s.io/apimachinery/pkg/runtime/schema" | ||
"sigs.k8s.io/controller-runtime/pkg/scheme" | ||
) | ||
|
||
var ( | ||
// GroupVersion is group version used to register these objects. | ||
GroupVersion = schema.GroupVersion{Group: "notification.toolkit.fluxcd.io", Version: "v1"} | ||
|
||
// SchemeBuilder is used to add go types to the GroupVersionKind scheme. | ||
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} | ||
|
||
// AddToScheme adds the types in this group-version to the given scheme. | ||
AddToScheme = SchemeBuilder.AddToScheme | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
/* | ||
Copyright 2023 The Flux authors | ||
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 v1 | ||
|
||
import ( | ||
"crypto/sha256" | ||
"fmt" | ||
"time" | ||
|
||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
|
||
"github.com/fluxcd/pkg/apis/meta" | ||
) | ||
|
||
const ( | ||
ReceiverKind string = "Receiver" | ||
ReceiverWebhookPath string = "/hook/" | ||
GenericReceiver string = "generic" | ||
GenericHMACReceiver string = "generic-hmac" | ||
GitHubReceiver string = "github" | ||
GitLabReceiver string = "gitlab" | ||
BitbucketReceiver string = "bitbucket" | ||
HarborReceiver string = "harbor" | ||
DockerHubReceiver string = "dockerhub" | ||
QuayReceiver string = "quay" | ||
GCRReceiver string = "gcr" | ||
NexusReceiver string = "nexus" | ||
ACRReceiver string = "acr" | ||
) | ||
|
||
// ReceiverSpec defines the desired state of the Receiver. | ||
type ReceiverSpec struct { | ||
// Type of webhook sender, used to determine | ||
// the validation procedure and payload deserialization. | ||
// +kubebuilder:validation:Enum=generic;generic-hmac;github;gitlab;bitbucket;harbor;dockerhub;quay;gcr;nexus;acr | ||
// +required | ||
Type string `json:"type"` | ||
|
||
// Interval at which to reconcile the Receiver with its Secret references. | ||
// +kubebuilder:validation:Type=string | ||
// +kubebuilder:validation:Pattern="^([0-9]+(\\.[0-9]+)?(ms|s|m|h))+$" | ||
// +kubebuilder:default:="10m" | ||
// +optional | ||
Interval *metav1.Duration `json:"interval,omitempty"` | ||
|
||
// Events specifies the list of event types to handle, | ||
// e.g. 'push' for GitHub or 'Push Hook' for GitLab. | ||
// +optional | ||
Events []string `json:"events,omitempty"` | ||
|
||
// A list of resources to be notified about changes. | ||
// +required | ||
Resources []CrossNamespaceObjectReference `json:"resources"` | ||
|
||
// SecretRef specifies the Secret containing the token used | ||
// to validate the payload authenticity. | ||
// +required | ||
SecretRef meta.LocalObjectReference `json:"secretRef"` | ||
|
||
// Suspend tells the controller to suspend subsequent | ||
// events handling for this receiver. | ||
// +optional | ||
Suspend bool `json:"suspend,omitempty"` | ||
} | ||
|
||
// ReceiverStatus defines the observed state of the Receiver. | ||
type ReceiverStatus struct { | ||
meta.ReconcileRequestStatus `json:",inline"` | ||
|
||
// Conditions holds the conditions for the Receiver. | ||
// +optional | ||
Conditions []metav1.Condition `json:"conditions,omitempty"` | ||
|
||
// URL is the generated incoming webhook address in the format | ||
// of '/hook/sha256sum(token+name+namespace)'. | ||
// Deprecated: Replaced by WebhookPath. | ||
// +optional | ||
URL string `json:"url,omitempty"` | ||
|
||
// WebhookPath is the generated incoming webhook address in the format | ||
// of '/hook/sha256sum(token+name+namespace)'. | ||
// +optional | ||
WebhookPath string `json:"webhookPath,omitempty"` | ||
|
||
// ObservedGeneration is the last observed generation of the Receiver object. | ||
// +optional | ||
ObservedGeneration int64 `json:"observedGeneration,omitempty"` | ||
} | ||
|
||
// GetConditions returns the status conditions of the object. | ||
func (in *Receiver) GetConditions() []metav1.Condition { | ||
return in.Status.Conditions | ||
} | ||
|
||
// SetConditions sets the status conditions on the object. | ||
func (in *Receiver) SetConditions(conditions []metav1.Condition) { | ||
in.Status.Conditions = conditions | ||
} | ||
|
||
// GetWebhookPath returns the incoming webhook path for the given token. | ||
func (in *Receiver) GetWebhookPath(token string) string { | ||
digest := sha256.Sum256([]byte(token + in.GetName() + in.GetNamespace())) | ||
return fmt.Sprintf("%s%x", ReceiverWebhookPath, digest) | ||
} | ||
|
||
// GetInterval returns the interval value with a default of 10m for this Receiver. | ||
func (in *Receiver) GetInterval() time.Duration { | ||
duration := 10 * time.Minute | ||
if in.Spec.Interval != nil { | ||
duration = in.Spec.Interval.Duration | ||
} | ||
|
||
return duration | ||
} | ||
|
||
// +genclient | ||
// +genclient:Namespaced | ||
// +kubebuilder:storageversion | ||
// +kubebuilder:object:root=true | ||
// +kubebuilder:subresource:status | ||
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="" | ||
// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type==\"Ready\")].status",description="" | ||
// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.conditions[?(@.type==\"Ready\")].message",description="" | ||
|
||
// Receiver is the Schema for the receivers API. | ||
type Receiver struct { | ||
metav1.TypeMeta `json:",inline"` | ||
metav1.ObjectMeta `json:"metadata,omitempty"` | ||
|
||
Spec ReceiverSpec `json:"spec,omitempty"` | ||
// +kubebuilder:default:={"observedGeneration":-1} | ||
Status ReceiverStatus `json:"status,omitempty"` | ||
} | ||
|
||
// +kubebuilder:object:root=true | ||
|
||
// ReceiverList contains a list of Receivers. | ||
type ReceiverList struct { | ||
metav1.TypeMeta `json:",inline"` | ||
metav1.ListMeta `json:"metadata,omitempty"` | ||
Items []Receiver `json:"items"` | ||
} | ||
|
||
func init() { | ||
SchemeBuilder.Register(&Receiver{}, &ReceiverList{}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* | ||
Copyright 2023 The Flux authors | ||
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 v1 | ||
|
||
// CrossNamespaceObjectReference contains enough information to let you locate the | ||
// typed referenced object at cluster level | ||
type CrossNamespaceObjectReference struct { | ||
// API version of the referent | ||
// +optional | ||
APIVersion string `json:"apiVersion,omitempty"` | ||
|
||
// Kind of the referent | ||
// +kubebuilder:validation:Enum=Bucket;GitRepository;Kustomization;HelmRelease;HelmChart;HelmRepository;ImageRepository;ImagePolicy;ImageUpdateAutomation;OCIRepository | ||
// +required | ||
Kind string `json:"kind"` | ||
|
||
// Name of the referent | ||
// If multiple resources are targeted `*` may be set. | ||
// +kubebuilder:validation:MinLength=1 | ||
// +kubebuilder:validation:MaxLength=53 | ||
// +required | ||
Name string `json:"name"` | ||
|
||
// Namespace of the referent | ||
// +kubebuilder:validation:MinLength=1 | ||
// +kubebuilder:validation:MaxLength=53 | ||
// +kubebuilder:validation:Optional | ||
// +optional | ||
Namespace string `json:"namespace,omitempty"` | ||
|
||
// MatchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels | ||
// map is equivalent to an element of matchExpressions, whose key field is "key", the | ||
// operator is "In", and the values array contains only "value". The requirements are ANDed. | ||
// MatchLabels requires the name to be set to `*`. | ||
// +optional | ||
MatchLabels map[string]string `json:"matchLabels,omitempty"` | ||
} |
Oops, something went wrong.