Skip to content

Commit

Permalink
feat: Implement reconcile logic
Browse files Browse the repository at this point in the history
  • Loading branch information
yiannistri committed Mar 24, 2022
1 parent 8e725c6 commit ec29f17
Show file tree
Hide file tree
Showing 13 changed files with 755 additions and 67 deletions.
32 changes: 32 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Development

## How to run the test suite

Prerequisites:
* Go >= 1.17
* clusterctl >= 1.1.3

You can run the test suite by simply doing

```sh
make test
```

## How to run the controller locally

Ensure the cluster you are using has the CAPI CRDs installed as the controller references them. If necessary, run the `clusterctl init` command:
```sh
clusterctl init
```

Install the controller's CRDs on your test cluster:

```sh
make install
```

Run the controller locally:

```sh
make run
```
37 changes: 27 additions & 10 deletions api/v1alpha1/cluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,45 @@ package v1alpha1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/fluxcd/pkg/apis/meta"
)

// 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.

// ClusterSpec defines the desired state of Cluster
type ClusterSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file

// Foo is an example field of Cluster. Edit cluster_types.go to remove/update
Foo string `json:"foo,omitempty"`
// SecretRef specifies the Secret containing the kubeconfig for a cluster.
// +optional
SecretRef *meta.LocalObjectReference `json:"secretRef,omitempty"`
// CAPIClusterRef specifies the CAPI Cluster.
// +optional
CAPIClusterRef *meta.LocalObjectReference `json:"capiClusterRef,omitempty"`
}

// ClusterStatus defines the observed state of Cluster
type ClusterStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
// Conditions holds the conditions for the Cluster.
// +optional
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

// GetConditions returns the status conditions of the object.
func (in Cluster) GetConditions() []metav1.Condition {
return in.Status.Conditions
}

// SetConditions sets the status conditions on the object.
func (in *Cluster) SetConditions(conditions []metav1.Condition) {
in.Status.Conditions = conditions
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status
// +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=""

// Cluster is the Schema for the clusters API
type Cluster struct {
Expand All @@ -50,7 +67,7 @@ type Cluster struct {
Status ClusterStatus `json:"status,omitempty"`
}

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

// ClusterList contains a list of Cluster
type ClusterList struct {
Expand Down
12 changes: 12 additions & 0 deletions api/v1alpha1/condition_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package v1alpha1

const (
// SecretFoundReason signals that a given secret has been found.
SecretFoundReason string = "SecretFound"
// WaitingForSecretReason signals that a given secret has not been found.
WaitingForSecretReason string = "WaitingForSecret"
// CAPIClusterFoundReason signals that a given CAPI cluster has been found.
CAPIClusterFoundReason string = "CAPIClusterFound"
// WaitingForCAPIClusterReason signals that a given CAPI cluster has not been found.
WaitingForCAPIClusterReason string = "WaitingForCAPICluster"
)
23 changes: 21 additions & 2 deletions api/v1alpha1/zz_generated.deepcopy.go

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

154 changes: 154 additions & 0 deletions config/crd/bases/gitops.weave.works_clusters.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.3.0
creationTimestamp: null
name: clusters.gitops.weave.works
spec:
additionalPrinterColumns:
- JSONPath: .metadata.creationTimestamp
name: Age
type: date
- JSONPath: .status.conditions[?(@.type=="Ready")].status
name: Ready
type: string
- JSONPath: .status.conditions[?(@.type=="Ready")].message
name: Status
type: string
group: gitops.weave.works
names:
kind: Cluster
listKind: ClusterList
plural: clusters
singular: cluster
scope: Namespaced
subresources:
status: {}
validation:
openAPIV3Schema:
description: Cluster is the Schema for the clusters 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
spec:
description: ClusterSpec defines the desired state of Cluster
properties:
capiClusterRef:
description: CAPIClusterRef specifies the CAPI Cluster.
properties:
name:
description: Name of the referent.
type: string
required:
- name
type: object
secretRef:
description: SecretRef specifies the Secret containing the kubeconfig
for a cluster.
properties:
name:
description: Name of the referent.
type: string
required:
- name
type: object
type: object
status:
description: ClusterStatus defines the observed state of Cluster
properties:
conditions:
description: Conditions holds the conditions for the Cluster.
items:
description: "Condition contains details for one aspect of the current
state of this API Resource. --- This struct is intended for direct
use as an array at the field path .status.conditions. For example,
type FooStatus struct{ // Represents the observations of a foo's
current state. // Known .status.conditions.type are: \"Available\",
\"Progressing\", and \"Degraded\" // +patchMergeKey=type //
+patchStrategy=merge // +listType=map // +listMapKey=type
\ Conditions []metav1.Condition `json:\"conditions,omitempty\"
patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
\n // other fields }"
properties:
lastTransitionTime:
description: lastTransitionTime is the last time the condition
transitioned from one status to another. This should be when
the underlying condition changed. If that is not known, then
using the time when the API field changed is acceptable.
format: date-time
type: string
message:
description: message is a human readable message indicating details
about the transition. This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: observedGeneration represents the .metadata.generation
that the condition was set based upon. For instance, if .metadata.generation
is currently 12, but the .status.conditions[x].observedGeneration
is 9, the condition is out of date with respect to the current
state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: reason contains a programmatic identifier indicating
the reason for the condition's last transition. Producers of
specific condition types may define expected values and meanings
for this field, and whether the values are considered a guaranteed
API. The value should be a CamelCase string. This field may
not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- "True"
- "False"
- Unknown
type: string
type:
description: type of condition in CamelCase or in foo.example.com/CamelCase.
--- Many .condition.type values are consistent across resources
like Available, but because arbitrary conditions can be useful
(see .node.status.conditions), the ability to deconflict is
important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
maxLength: 316
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
type: object
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
34 changes: 34 additions & 0 deletions config/rbac/role.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
creationTimestamp: null
name: manager-role
rules:
- apiGroups:
- gitops.weave.works
resources:
- clusters
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- gitops.weave.works
resources:
- clusters/finalizers
verbs:
- update
- apiGroups:
- gitops.weave.works
resources:
- clusters/status
verbs:
- get
- patch
- update
8 changes: 8 additions & 0 deletions config/samples/gitops_v1alpha1_cluster_capi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
apiVersion: gitops.weave.works/v1alpha1
kind: Cluster
metadata:
name: dev
namespace: default
spec:
capiClusterRef:
name: dev
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
apiVersion: gitops.weave.works/v1alpha1
kind: Cluster
metadata:
name: cluster-sample
name: dev
namespace: default
spec:
# TODO(user): Add fields here
secretRef:
name: dev

0 comments on commit ec29f17

Please sign in to comment.