Skip to content

Commit

Permalink
update crd example
Browse files Browse the repository at this point in the history
  • Loading branch information
Mengqi Yu committed Mar 1, 2019
1 parent 981c9ee commit 81d53b3
Show file tree
Hide file tree
Showing 12 changed files with 180 additions and 318 deletions.
17 changes: 0 additions & 17 deletions examples/crd/Dockerfile

This file was deleted.

5 changes: 0 additions & 5 deletions examples/crd/README.md

This file was deleted.

7 changes: 0 additions & 7 deletions examples/crd/config/crew_namespace.yaml

This file was deleted.

27 changes: 0 additions & 27 deletions examples/crd/config/firstmate_crd.yaml

This file was deleted.

21 changes: 0 additions & 21 deletions examples/crd/config/kustomization.yaml

This file was deleted.

11 changes: 0 additions & 11 deletions examples/crd/config/manager_image_patch.yaml

This file was deleted.

33 changes: 0 additions & 33 deletions examples/crd/config/manager_rbac.yaml

This file was deleted.

79 changes: 0 additions & 79 deletions examples/crd/controller.go

This file was deleted.

127 changes: 100 additions & 27 deletions examples/crd/main.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright 2018 The Kubernetes Authors.
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand All @@ -14,54 +14,127 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

//go:generate go run ./vendor/sigs.k8s.io/controller-tools/cmd/crd generate --domain metamagical.io
package main

import (
"flag"
"context"
"math/rand"
"os"
"time"

appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"sigs.k8s.io/controller-runtime/examples/crd/pkg"
"sigs.k8s.io/controller-runtime/pkg/builder"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/manager"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
ctrl "sigs.k8s.io/controller-runtime"
api "sigs.k8s.io/controller-runtime/examples/crd/pkg"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
)

var log = logf.Log.WithName("example-controller")
var (
setupLog = ctrl.Log.WithName("setup")
recLog = ctrl.Log.WithName("reconciler")
)

type reconciler struct {
client.Client
scheme *runtime.Scheme
}

func (r *reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
log := recLog.WithValues("chaospod", req.NamespacedName)
log.V(1).Info("reconciling chaos pod")
ctx := context.Background()

var chaosctl api.ChaosPod
if err := r.Get(ctx, req.NamespacedName, &chaosctl); err != nil {
log.Error(err, "unable to get chaosctl")
return ctrl.Result{}, err
}

var pod corev1.Pod
podFound := true
if err := r.Get(ctx, req.NamespacedName, &pod); err != nil {
if !apierrors.IsNotFound(err) {
log.Error(err, "unable to get pod")
return ctrl.Result{}, err
}
podFound = false
}

if podFound {
shouldStop := chaosctl.Spec.NextStop.Time.Before(time.Now())
if !shouldStop {
return ctrl.Result{RequeueAfter: chaosctl.Spec.NextStop.Sub(time.Now()) + 1*time.Second}, nil
}

if err := r.Delete(ctx, &pod); err != nil {
log.Error(err, "unable to delete pod")
return ctrl.Result{}, err
}

return ctrl.Result{Requeue: true}, nil
}

templ := chaosctl.Spec.Template.DeepCopy()
pod.ObjectMeta = templ.ObjectMeta
pod.Name = req.Name
pod.Namespace = req.Namespace
pod.Spec = templ.Spec

if err := ctrl.SetControllerReference(&chaosctl, &pod, r.scheme); err != nil {
log.Error(err, "unable to set pod's owner reference")
return ctrl.Result{}, err
}

if err := r.Create(ctx, &pod); err != nil {
log.Error(err, "unable to create pod")
return ctrl.Result{}, err
}

chaosctl.Spec.NextStop.Time = time.Now().Add(time.Duration(10*(rand.Int63n(2)+1)) * time.Second)
chaosctl.Status.LastRun = pod.CreationTimestamp
if err := r.Update(ctx, &chaosctl); err != nil {
log.Error(err, "unable to update chaosctl status")
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
}

func main() {
flag.Parse()
entryLog := log.WithName("entrypoint")
ctrl.SetLogger(zap.Logger(true))

entryLog.Info("setting up manager")
mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{})
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{})
if err != nil {
entryLog.Error(err, "unable to set up overall controller manager")
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}

entryLog.Info("setting up scheme")
if err := pkg.AddToScheme(mgr.GetScheme()); err != nil {
entryLog.Error(err, "unable add APIs to scheme")
// in a real controller, we'd create a new scheme for this
err = api.AddToScheme(mgr.GetScheme())
if err != nil {
setupLog.Error(err, "unable to add scheme")
os.Exit(1)
}

entryLog.Info("setting up controllers")
err = builder.ControllerManagedBy(mgr).
For(&pkg.FirstMate{}).
Owns(&appsv1.Deployment{}).
Complete(&FirstMateController{})
err = ctrl.NewControllerManagedBy(mgr).
For(&api.ChaosPod{}).
Owns(&corev1.Pod{}).
Complete(&reconciler{
Client: mgr.GetClient(),
scheme: mgr.GetScheme(),
})

if err != nil {
entryLog.Error(err, "unable to set up controllers")
setupLog.Error(err, "unable to create controller")
os.Exit(1)
}

entryLog.Info("starting manager")
if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
entryLog.Error(err, "unable to run manager")
setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}
8 changes: 1 addition & 7 deletions examples/crd/pkg/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,10 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// Package pkg contains API Schema definitions for the crew v1 API group
// +k8s:openapi-gen=true
// +k8s:deepcopy-gen=package,register
// +k8s:conversion-gen=sigs.k8s.io/kubebuilder/test/project/pkg/apis/crew
// +k8s:defaulter-gen=TypeMeta
// +groupName=crew.example.com
package pkg

import (
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
)

var log = logf.Log.WithName("firstmate-resource")
var log = logf.Log.WithName("chaospod-resource")
Loading

0 comments on commit 81d53b3

Please sign in to comment.