Skip to content

Commit

Permalink
stubs out Job
Browse files Browse the repository at this point in the history
WIP parking

adds generated job template; controller updates

addtl cleanup

refactors some chart operations; converts job.command to job.containers

adds unit tests; refactors AppCondition

fixes one merge conflict

rm unneeded tests
  • Loading branch information
stinkyfingers committed Jul 16, 2021
1 parent b804dfe commit 7d98f61
Show file tree
Hide file tree
Showing 24 changed files with 1,197 additions and 102 deletions.
18 changes: 18 additions & 0 deletions cmd/manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ func main() {
setupLog.Error(err, "unable to set default templates")
os.Exit(1)
}
if err = storage.Update(templates.IngressConfigMapName("none"), templates.NoIngressTemplates); err != nil {
setupLog.Error(err, "unable to set default templates")
os.Exit(1)
}

if err = (&controllers.AppReconciler{
TemplateReader: storage,
Expand All @@ -103,6 +107,20 @@ func main() {
os.Exit(1)
}

if err = (&controllers.JobReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("Job"),
Scheme: mgr.GetScheme(),
TemplateReader: storage,
HelmFactoryFn: func(namespace string) (controllers.Helm, error) {
return chart.NewHelmClient(namespace)
},
Recorder: mgr.GetEventRecorderFor("Job"),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Job")
os.Exit(1)
}

if err = (&controllers.FrameworkReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("Framework"),
Expand Down
4 changes: 2 additions & 2 deletions config/crd/bases/theketch.io_apps.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ spec:
description:
maxLength: 140
type: string
dockerRegisty:
dockerRegistry:
description: DockerRegistry contains docker registry configuration of
the application.
properties:
Expand Down Expand Up @@ -514,7 +514,7 @@ spec:
conditions:
description: Conditions of App resource.
items:
description: AppCondition contains details for the current condition
description: Condition contains details for the current condition
of this app.
properties:
lastTransitionTime:
Expand Down
4 changes: 4 additions & 0 deletions config/crd/bases/theketch.io_frameworks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ spec:
items:
type: string
type: array
jobs:
items:
type: string
type: array
message:
type: string
namespace:
Expand Down
189 changes: 189 additions & 0 deletions config/crd/bases/theketch.io_jobs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.5
creationTimestamp: null
name: jobs.theketch.io
spec:
group: theketch.io
names:
kind: Job
listKind: JobList
plural: jobs
singular: job
scope: Namespaced
subresources:
status: {}
validation:
openAPIV3Schema:
description: Job is the Schema for the jobs 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: JobSpec defines the desired state of Job
properties:
backoffLimit:
type: integer
completions:
type: integer
containers:
items:
description: Container represents a single container run in a Job
properties:
command:
items:
type: string
type: array
image:
type: string
name:
type: string
required:
- command
- image
- name
type: object
type: array
description:
type: string
framework:
type: string
name:
type: string
parallelism:
type: integer
policy:
description: Policy represents the policy types a job can have
properties:
restartPolicy:
type: string
required:
- restartPolicy
type: object
suspend:
type: boolean
type:
type: string
version:
type: string
required:
- description
- framework
- name
- policy
- type
- version
type: object
status:
description: JobStatus defines the observed state of Job
properties:
conditions:
items:
description: Condition contains details for the current condition
of this app.
properties:
lastTransitionTime:
description: LastTransitionTime is the timestamp corresponding
to the last status.
format: date-time
type: string
message:
description: A human readable message indicating details about
why the application is in this condition.
type: string
status:
description: Status of the condition.
type: string
type:
description: Type of the condition.
type: string
required:
- status
- type
type: object
type: array
framework:
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. 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
type: object
type: object
version: v1beta1
versions:
- name: v1beta1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
26 changes: 26 additions & 0 deletions config/rbac/role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,32 @@ rules:
- patch
- update
- watch
- apiGroups:
- resources.resources
resources:
- jobs
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- resources.resources
resources:
- jobs/finalizers
verbs:
- update
- apiGroups:
- resources.resources
resources:
- jobs/status
verbs:
- get
- patch
- update
- apiGroups:
- theketch.io
resources:
Expand Down
35 changes: 5 additions & 30 deletions internal/api/v1beta1/app_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,36 +132,11 @@ const (
AppRunning AppPhase = "Running"
)

type AppConditionType string

// These are valid conditions of app.
const (

// AppScheduled indicates whether the has been processed by ketch-controller.
AppScheduled AppConditionType = "Scheduled"
)

// AppCondition contains details for the current condition of this app.
type AppCondition struct {

// Type of the condition.
Type AppConditionType `json:"type"`

// Status of the condition.
Status v1.ConditionStatus `json:"status"`

// LastTransitionTime is the timestamp corresponding to the last status.
LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"`

// A human readable message indicating details about why the application is in this condition.
Message string `json:"message,omitempty"`
}

// AppStatus represents information about the status of an application.
type AppStatus struct {

// Conditions of App resource.
Conditions []AppCondition `json:"conditions,omitempty"`
Conditions []Condition `json:"conditions,omitempty"`

Framework *v1.ObjectReference `json:"framework,omitempty"`
}
Expand Down Expand Up @@ -214,7 +189,7 @@ type AppSpec struct {
Ingress IngressSpec `json:"ingress"`

// DockerRegistry contains docker registry configuration of the application.
DockerRegistry DockerRegistrySpec `json:"dockerRegisty,omitempty"`
DockerRegistry DockerRegistrySpec `json:"dockerRegistry,omitempty"`

// Builder is the name of the builder used to build source code.
Builder string `json:"builder,omitempty"`
Expand Down Expand Up @@ -442,8 +417,8 @@ func (app *App) ExposedPorts() map[DeploymentVersion][]ExposedPort {
}

// SetCondition sets Status and message fields of the given type of condition to the provided values.
func (app *App) SetCondition(t AppConditionType, status v1.ConditionStatus, message string, time metav1.Time) {
c := AppCondition{
func (app *App) SetCondition(t ConditionType, status v1.ConditionStatus, message string, time metav1.Time) {
c := Condition{
Type: t,
Status: status,
LastTransitionTime: &time,
Expand Down Expand Up @@ -475,7 +450,7 @@ func (app *App) Phase() AppPhase {
}

// Condition looks for a condition with the provided type in the condition list and returns it.
func (s AppStatus) Condition(t AppConditionType) *AppCondition {
func (s AppStatus) Condition(t ConditionType) *Condition {
for _, c := range s.Conditions {
if c.Type == t {
return &c
Expand Down
Loading

0 comments on commit 7d98f61

Please sign in to comment.