diff --git a/Gopkg.lock b/Gopkg.lock index 88ca558..efa4712 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -851,15 +851,26 @@ "pkg/client", "pkg/client/apiutil", "pkg/client/config", + "pkg/controller", + "pkg/controller/controllerutil", + "pkg/event", + "pkg/handler", + "pkg/internal/controller", + "pkg/internal/controller/metrics", "pkg/internal/recorder", "pkg/leaderelection", "pkg/manager", "pkg/metrics", "pkg/patch", + "pkg/predicate", + "pkg/reconcile", "pkg/recorder", "pkg/runtime/inject", "pkg/runtime/log", + "pkg/runtime/scheme", "pkg/runtime/signals", + "pkg/source", + "pkg/source/internal", "pkg/webhook/admission", "pkg/webhook/admission/types", "pkg/webhook/internal/metrics", @@ -896,13 +907,20 @@ analyzer-name = "dep" analyzer-version = 1 input-imports = [ + "github.com/go-openapi/spec", "github.com/operator-framework/operator-sdk/pkg/k8sutil", "github.com/operator-framework/operator-sdk/pkg/leader", "github.com/operator-framework/operator-sdk/pkg/log/zap", "github.com/operator-framework/operator-sdk/pkg/metrics", "github.com/operator-framework/operator-sdk/version", "github.com/spf13/pflag", + "k8s.io/api/core/v1", + "k8s.io/apimachinery/pkg/api/errors", + "k8s.io/apimachinery/pkg/apis/meta/v1", + "k8s.io/apimachinery/pkg/labels", "k8s.io/apimachinery/pkg/runtime", + "k8s.io/apimachinery/pkg/runtime/schema", + "k8s.io/apimachinery/pkg/types", "k8s.io/client-go/plugin/pkg/client/auth/gcp", "k8s.io/code-generator/cmd/client-gen", "k8s.io/code-generator/cmd/conversion-gen", @@ -912,10 +930,18 @@ "k8s.io/code-generator/cmd/lister-gen", "k8s.io/gengo/args", "k8s.io/kube-openapi/cmd/openapi-gen", + "k8s.io/kube-openapi/pkg/common", + "sigs.k8s.io/controller-runtime/pkg/client", "sigs.k8s.io/controller-runtime/pkg/client/config", + "sigs.k8s.io/controller-runtime/pkg/controller", + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil", + "sigs.k8s.io/controller-runtime/pkg/handler", "sigs.k8s.io/controller-runtime/pkg/manager", + "sigs.k8s.io/controller-runtime/pkg/reconcile", "sigs.k8s.io/controller-runtime/pkg/runtime/log", + "sigs.k8s.io/controller-runtime/pkg/runtime/scheme", "sigs.k8s.io/controller-runtime/pkg/runtime/signals", + "sigs.k8s.io/controller-runtime/pkg/source", "sigs.k8s.io/controller-tools/pkg/crd/generator", ] solver-name = "gps-cdcl" diff --git a/pkg/scheme/tomcat/defaults.go b/pkg/scheme/tomcat/defaults.go new file mode 100644 index 0000000..d2f9bbb --- /dev/null +++ b/pkg/scheme/tomcat/defaults.go @@ -0,0 +1,21 @@ +package tomcat + +var ( + defaultServicePort int32 = 80 +) + +const ( + defaultImage string = "tomcat:latest" +) + +// SetDefaults sets Tomcat field defaults +func (o *Tomcat) SetDefaults() { + + if len(o.Spec.Image) == 0 { + o.Spec.Image = defaultImage + } + + if o.Spec.ServicePort == nil { + o.Spec.ServicePort = &defaultServicePort + } +} diff --git a/pkg/scheme/tomcat/template.go b/pkg/scheme/tomcat/template.go new file mode 100644 index 0000000..581def4 --- /dev/null +++ b/pkg/scheme/tomcat/template.go @@ -0,0 +1,30 @@ +package tomcat + +import ( + corev1 "k8s.io/api/core/v1" +) + +const ( + tomcatHTTPPort = 8080 +) + +// TomcatServerPodTemplateSpec generates a pod template spec suitable for use in Tomcat deployment +func (tomcat *Tomcat) TomcatServerPodTemplateSpec() (out corev1.PodTemplateSpec) { + out = corev1.PodTemplateSpec{} + out.ObjectMeta.Labels = tomcat.TomcatServerPodLabels() + + out.Spec.Containers = []corev1.Container{ + { + Name: "tomcat", + Image: tomcat.Spec.Image, + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: int32(tomcatHTTPPort), + }, + }, + }, + } + + return out +} diff --git a/pkg/scheme/tomcat/tomcat.go b/pkg/scheme/tomcat/tomcat.go new file mode 100644 index 0000000..6591040 --- /dev/null +++ b/pkg/scheme/tomcat/tomcat.go @@ -0,0 +1,77 @@ +package tomcat + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/labels" + + tomcatv1alpha1 "github.com/kube-incubator/tomcat-operator/pkg/apis/tomcat/v1alpha1" +) + +// Tomcat embeds tomcatv1alpha1.Tomcat and adds utility functions +type Tomcat struct { + *tomcatv1alpha1.Tomcat +} + +type component struct { + name string + objNameFmt string + objName string +} + +var ( + // TomcatDeployment component + TomcatDeployment = component{name: "tomcat-server", objNameFmt: "%s"} + // TomcatService component + TomcatService = component{name: "tomcat-server", objNameFmt: "%s"} +) + +// New wraps a tomcatv1alpha1.Tomcat into a Tomcat object +func New(obj *tomcatv1alpha1.Tomcat) *Tomcat { + return &Tomcat{obj} +} + +// Unwrap returns the wrapped tomcatv1alpha1.Tomcat object +func (o *Tomcat) Unwrap() *tomcatv1alpha1.Tomcat { + return o.Tomcat +} + +// Labels returns default label set for tomcatv1alpha1.Tomcat +func (o *Tomcat) Labels() labels.Set { + partOf := "tomcat" + if o.ObjectMeta.Labels != nil && len(o.ObjectMeta.Labels["app.kubernetes.io/part-of"]) > 0 { + partOf = o.ObjectMeta.Labels["app.kubernetes.io/part-of"] + } + + labels := labels.Set{ + "app.kubernetes.io/name": "tomcat", + "app.kubernetes.io/part-of": partOf, + "app.kubernetes.io/instance": o.ObjectMeta.Name, + } + + return labels +} + +// ComponentLabels returns labels for a label set for a tomcatv1alpha1.Tomcat component +func (o *Tomcat) ComponentLabels(component component) labels.Set { + l := o.Labels() + l["app.kubernetes.io/component"] = component.name + return l +} + +// ComponentName returns the object name for a component +func (o *Tomcat) ComponentName(component component) string { + name := component.objName + if len(component.objNameFmt) > 0 { + name = fmt.Sprintf(component.objNameFmt, o.ObjectMeta.Name) + } + + return name +} + +// TomcatServerPodLabels return labels to apply to tomcat server pods +func (o *Tomcat) TomcatServerPodLabels() labels.Set { + l := o.Labels() + l["app.kubernetes.io/component"] = "tomcat-server" + return l +}