Skip to content

Commit

Permalink
Merge pull request #8 from yashvardhan-kukreja/yashvardhan/reference-…
Browse files Browse the repository at this point in the history
…addon-controller-and-api

feat: add reference-addon controller and API
  • Loading branch information
openshift-merge-robot authored Feb 16, 2022
2 parents d34e1be + 0b82dba commit 0411475
Show file tree
Hide file tree
Showing 7 changed files with 347 additions and 9 deletions.
47 changes: 47 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -263,11 +263,58 @@ load-reference-addon: build-image-reference-addon-manager
--name reference-addon-e2e
.PHONY: load-reference-addon


## Install Reference Addon CRDs in to the currently selected cluster.
load-reference-addon-crds: generate
@for crd in $(wildcard config/deploy/*.openshift.io_*.yaml); do \
kubectl apply -f $$crd; \
done
.PHONY: load-reference-addon-crds

# Template deployment
config/deploy/deployment.yaml: FORCE $(YQ)
@yq eval '.spec.template.spec.containers[0].image = "$(REFERENCE_ADDON_MANAGER_IMAGE)"' \
config/deploy/deployment.tpl.yaml > config/deploy/deployment.yaml

### Setup the reference addon from scratch with its fundamental resources (Deployments, Roles, etc.)
setup-reference-addon-from-scratch: load-reference-addon-crds \
load-reference-addon \
config/deploy/deployment.yaml
@(source hack/determine-container-runtime.sh; \
kubectl apply -f config/deploy; \
echo -e "\nwaiting for deployment/reference-addon..."; \
kubectl wait --for=condition=available deployment/reference-addon -n reference-addon --timeout=240s; \
echo; \
) 2>&1 | sed 's/^/ /'

# Template Addon
# TODO(ykukreja): shift to making use of image digests here instead of tag. Currently blocked!
config/addon/reference-addon.yaml: FORCE $(YQ)
$(eval IMAGE_NAME := reference-addon-index)
@yq eval '.spec.install.olmOwnNamespace.catalogSourceImage = "${IMAGE_ORG}/${IMAGE_NAME}:${VERSION}"' \
config/addon/reference-addon.tpl.yaml > config/addon/reference-addon.yaml

### TODO(ykukreja): Currently not viable to use. Blocked on the support for having local registry setup.
### TODO(ykukreja): Add target for recognising and modifying the registry host instead of using quay.io
setup-reference-addon: | \
push-image-reference-addon-index \
config/addon/reference-addon.yaml

# make sure that we install our components into the kind cluster and disregard normal $KUBECONFIG
dev-setup: export KUBECONFIG=$(abspath $(KIND_KUBECONFIG))
## Setup a local env for feature development. (Kind, OLM, OKD Console)
dev-setup: | \
create-kind-cluster \
apply-olm \
spply-openshift-console
.PHONY: dev-setup

## Setup a local env for integration test development. (Kind, OLM, OKD Console, Addon Operator).
test-setup: | \
dev-setup \
setup-reference-addon
.PHONY: test-setup

# Installs OLM (Operator Lifecycle Manager) into the currently selected cluster.
apply-olm:
@echo "installing OLM $(OLM_VERSION)..."
Expand Down
38 changes: 38 additions & 0 deletions apis/reference/v1alpha1/referenceaddon_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package v1alpha1

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

// ReferenceAddonSpec defines the desired state of ReferenceAddon.
type ReferenceAddonSpec struct {
}

// ReferenceAddonStatus defines the observed state of ReferenceAddon
type ReferenceAddonStatus struct {
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
Conditions []metav1.Condition `json:"conditions,omitempty"`
}

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
type ReferenceAddon struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec ReferenceAddonSpec `json:"spec,omitempty"`
Status ReferenceAddonStatus `json:"status,omitempty"`
}

// ReferenceAddonList contains a list of ReferenceAddons
// +kubebuilder:object:root=true
type ReferenceAddonList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ReferenceAddon `json:"items"`
}

func init() {
SchemeBuilder.Register(&ReferenceAddon{}, &ReferenceAddonList{})
}
106 changes: 106 additions & 0 deletions apis/reference/v1alpha1/zz_generated.deepcopy.go

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

21 changes: 12 additions & 9 deletions cmd/reference-addon-manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/manager"

refapis "github.com/openshift/reference-addon/apis"
// "github.com/openshift/reference-addon/internal/controllers"
"github.com/openshift/reference-addon/internal/controllers"
)

var (
Expand Down Expand Up @@ -92,14 +92,17 @@ func main() {
}
}

// if err = (&controllers.AddonReconciler{
// Client: mgr.GetClient(),
// Log: ctrl.Log.WithName("controllers").WithName("Addon"),
// Scheme: mgr.GetScheme(),
// }).SetupWithManager(mgr); err != nil {
// setupLog.Error(err, "unable to create controller", "controller", "Addon")
// os.Exit(1)
// }
// the following section hooks up a heartbeat reporter with the current addon/operator
r := controllers.ReferenceAddonReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("ReferenceAddon"),
Scheme: mgr.GetScheme(),
}

if err = r.SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "ReferenceAddon")
os.Exit(1)
}

setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.5.0
creationTimestamp: null
name: referenceaddons.reference.addons.managed.openshift.io
spec:
group: reference.addons.managed.openshift.io
names:
kind: ReferenceAddon
listKind: ReferenceAddonList
plural: referenceaddons
singular: referenceaddon
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1alpha1
schema:
openAPIV3Schema:
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: ReferenceAddonSpec defines the desired state of ReferenceAddon.
type: object
status:
description: ReferenceAddonStatus defines the observed state of ReferenceAddon
properties:
conditions:
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
observedGeneration:
format: int64
type: integer
type: object
type: object
served: true
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
5 changes: 5 additions & 0 deletions config/example/reference-addon.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
apiVersion: reference.addons.managed.openshift.io/v1alpha1
kind: ReferenceAddon
metadata:
name: reference-addon
namespace: reference-addon
41 changes: 41 additions & 0 deletions internal/controllers/reference_addon_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package controllers

import (
"context"
"strings"

"github.com/go-logr/logr"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"

refapisv1alpha1 "github.com/openshift/reference-addon/apis/reference/v1alpha1"
)

type ReferenceAddonReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
}

func (r *ReferenceAddonReconciler) Reconcile(
ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := r.Log.WithValues("addon", req.NamespacedName.String())

// dummy code to indicate reconciliation of the reference-addon object
if strings.HasPrefix(req.NamespacedName.Name, "redhat-") {
log.Info("reconciling for a reference addon object prefixed by redhat- ")
} else if strings.HasPrefix(req.NamespacedName.Name, "reference-addon") {
log.Info("reconciling for a reference addon object named reference-addon")
} else {
log.Info("reconciling for a reference addon object not prefixed by redhat- or named reference-addon")
}

return ctrl.Result{}, nil
}

func (r *ReferenceAddonReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&refapisv1alpha1.ReferenceAddon{}).
Complete(r)
}

0 comments on commit 0411475

Please sign in to comment.