Skip to content

Commit

Permalink
Add ClusterAddon and ClusterReconciler controllers and types (#39)
Browse files Browse the repository at this point in the history
Part of #29
  • Loading branch information
Nitish Tiwari committed Jul 6, 2023
1 parent 00ff9b3 commit dd2a8cd
Show file tree
Hide file tree
Showing 14 changed files with 636 additions and 4 deletions.
14 changes: 14 additions & 0 deletions PROJECT
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,18 @@ resources:
kind: HetznerNodeImageRelease
path: github.com/syself/cluster-stack-operator/api/v1alpha1
version: v1alpha1
- api:
crdVersion: v1
namespaced: true
controller: true
domain: syself.io
group: infrastructure.cluster.x-k8s.io
kind: ClusterAddon
path: github.com/syself/cluster-stack-operator/api/v1alpha1
version: v1alpha1
- controller: true
domain: syself.io
group: infrastructure.cluster.x-k8s.io
kind: ClusterReconciler
version: v1alpha1
version: "3"
64 changes: 64 additions & 0 deletions api/v1alpha1/clusteraddon_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
Copyright 2023.
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 v1alpha1

import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.

// ClusterAddonSpec defines the desired state of ClusterAddon
type ClusterAddonSpec struct {
ClusterStack string `json:"clusterStack,omitempty"`
ClusterAddonVersion string `json:"clusterAddonVersion,omitempty"`
ClusterRef *corev1.ObjectReference `json:"clusterRef,omitempty"`
}

// ClusterAddonStatus defines the observed state of ClusterAddon
type ClusterAddonStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// ClusterAddon is the Schema for the clusteraddons API
type ClusterAddon struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

OwnerReferences metav1.OwnerReference `json:"ownerReferences"`
Spec ClusterAddonSpec `json:"spec,omitempty"`
Status ClusterAddonStatus `json:"status,omitempty"`
}

//+kubebuilder:object:root=true

// ClusterAddonList contains a list of ClusterAddon
type ClusterAddonList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ClusterAddon `json:"items"`
}

func init() {
SchemeBuilder.Register(&ClusterAddon{}, &ClusterAddonList{})
}
95 changes: 95 additions & 0 deletions api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 17 additions & 3 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,16 @@ import (
_ "k8s.io/client-go/plugin/pkg/client/auth"

caph "github.com/syself/cluster-api-provider-hetzner/api/v1beta1"
csov1alpha1 "github.com/syself/cluster-stack-operator/api/v1alpha1"
"github.com/syself/cluster-stack-operator/internal/controller"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"

csov1alpha1 "github.com/syself/cluster-stack-operator/api/v1alpha1"
"github.com/syself/cluster-stack-operator/internal/controller"
//+kubebuilder:scaffold:imports
)

Expand All @@ -48,7 +49,6 @@ func init() {

utilruntime.Must(csov1alpha1.AddToScheme(scheme))
utilruntime.Must(caph.AddToScheme(scheme))

//+kubebuilder:scaffold:scheme
}

Expand Down Expand Up @@ -129,6 +129,20 @@ func main() {
setupLog.Error(err, "unable to create controller", "controller", "HetznerNodeImageRelease")
os.Exit(1)
}
if err = (&controller.ClusterAddonReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ClusterAddon")
os.Exit(1)
}
if err = (&controller.ClusterReconcilerReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ClusterReconciler")
os.Exit(1)
}
//+kubebuilder:scaffold:builder

if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.12.0
name: clusteraddons.infrastructure.cluster.x-k8s.io.syself.io
spec:
group: infrastructure.cluster.x-k8s.io.syself.io
names:
kind: ClusterAddon
listKind: ClusterAddonList
plural: clusteraddons
singular: clusteraddon
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
description: ClusterAddon is the Schema for the clusteraddons API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
ownerReferences:
description: OwnerReference contains enough information to let you identify
an owning object. An owning object must be in the same namespace as
the dependent, or be cluster-scoped, so there is no namespace field.
properties:
apiVersion:
description: API version of the referent.
type: string
blockOwnerDeletion:
description: If true, AND if the owner has the "foregroundDeletion"
finalizer, then the owner cannot be deleted from the key-value store
until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion
for how the garbage collector interacts with this field and enforces
the foreground deletion. Defaults to false. To set this field, a
user needs "delete" permission of the owner, otherwise 422 (Unprocessable
Entity) will be returned.
type: boolean
controller:
description: If true, this reference points to the managing controller.
type: boolean
kind:
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
name:
description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names'
type: string
uid:
description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids'
type: string
required:
- apiVersion
- kind
- name
- uid
type: object
x-kubernetes-map-type: atomic
spec:
description: ClusterAddonSpec defines the desired state of ClusterAddon
properties:
clusterAddonVersion:
type: string
clusterRef:
description: "ObjectReference contains enough information to let you
inspect or modify the referred object. --- New uses of this type
are discouraged because of difficulty describing its usage when
embedded in APIs. 1. Ignored fields. It includes many fields which
are not generally honored. For instance, ResourceVersion and FieldPath
are both very rarely valid in actual usage. 2. Invalid usage help.
\ It is impossible to add specific help for individual usage. In
most embedded usages, there are particular restrictions like, \"must
refer only to types A and B\" or \"UID not honored\" or \"name must
be restricted\". Those cannot be well described when embedded. 3.
Inconsistent validation. Because the usages are different, the
validation rules are different by usage, which makes it hard for
users to predict what will happen. 4. The fields are both imprecise
and overly precise. Kind is not a precise mapping to a URL. This
can produce ambiguity during interpretation and require a REST mapping.
\ In most cases, the dependency is on the group,resource tuple and
the version of the actual struct is irrelevant. 5. We cannot easily
change it. Because this type is embedded in many locations, updates
to this type will affect numerous schemas. Don't make new APIs
embed an underspecified API type they do not control. \n Instead
of using this type, create a locally provided and used type that
is well-focused on your reference. For example, ServiceReferences
for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533
."
properties:
apiVersion:
description: API version of the referent.
type: string
fieldPath:
description: 'If referring to a piece of an object instead of
an entire object, this string should contain a valid JSON/Go
field access statement, such as desiredState.manifest.containers[2].
For example, if the object reference is to a container within
a pod, this would take on a value like: "spec.containers{name}"
(where "name" refers to the name of the container that triggered
the event) or if no container name is specified "spec.containers[2]"
(container with index 2 in this pod). This syntax is chosen
only to have some well-defined way of referencing a part of
an object. TODO: this design is not final and this field is
subject to change in the future.'
type: string
kind:
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
name:
description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
type: string
namespace:
description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
type: string
resourceVersion:
description: 'Specific resourceVersion to which this reference
is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
type: string
uid:
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
type: string
type: object
x-kubernetes-map-type: atomic
clusterStack:
type: string
type: object
status:
description: ClusterAddonStatus defines the observed state of ClusterAddon
type: object
required:
- ownerReferences
type: object
served: true
storage: true
subresources:
status: {}
Loading

0 comments on commit dd2a8cd

Please sign in to comment.