Split out the Package type into a first class Kubernetes resource. Before this change, packages were implicitly tied to functions. This wasn't ideal because: * Functions will need to share packages * A package storage system may be more generally useful than just functions (for example, for storing static assets) This change does the following: * Updates the fission and tpr types to add a new Package and PackageSpec. It also creates a PackageRef type, and a FunctionPackageRef type. The PackageRef simply references a package, but the FunctionPackageRef includes the name of a function within the package. This allows us to share packages between different functions. * Updates fetcher and other components for first-class packages * Allows customization of fetcher image pull policy in the helm charts
231 lines
6.8 KiB
Go
231 lines
6.8 KiB
Go
/*
|
|
Copyright 2016 The Fission Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package tpr
|
|
|
|
import (
|
|
"k8s.io/client-go/1.5/pkg/api"
|
|
"k8s.io/client-go/1.5/pkg/api/meta"
|
|
"k8s.io/client-go/1.5/pkg/api/unversioned"
|
|
|
|
"github.com/fission/fission"
|
|
)
|
|
|
|
//
|
|
// To add a Fission TPR type:
|
|
// 1. Create a "spec" type, for everything in the type except metadata
|
|
// 2. Create the type with metadata + the spec
|
|
// 3. Create a list type (for example see FunctionList and Function, below)
|
|
// 4. Add methods at the bottom of this file for satisfying Object and List interfaces
|
|
// 5. Add the type to configureClient in client.go
|
|
// 6. Add the type to EnsureFissionTPRs in tpr.go
|
|
// 7. Add tests to tpr_test.go
|
|
// 8. Add a CRUD Interface type (analogous to FunctionInterface in function.go)
|
|
// 9. Add a getter method for your interface type to FissionClient in client.go
|
|
//
|
|
|
|
type (
|
|
// Packages. Think of these as function-level images.
|
|
Package struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.PackageSpec `json:"spec"`
|
|
}
|
|
PackageList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Package `json:"items"`
|
|
}
|
|
|
|
// Functions.
|
|
Function struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.FunctionSpec `json:"spec"`
|
|
}
|
|
FunctionList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Function `json:"items"`
|
|
}
|
|
|
|
// Environments.
|
|
Environment struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.EnvironmentSpec `json:"spec"`
|
|
}
|
|
EnvironmentList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Environment `json:"items"`
|
|
}
|
|
|
|
// HTTP Triggers. (Something in the TPR reflection stuff wants
|
|
// it to be spelled "Httptrigger" not "HTTPTrigger" or even
|
|
// "HttpTrigger". Bleh.)
|
|
Httptrigger struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.HTTPTriggerSpec `json:"spec"`
|
|
}
|
|
HttptriggerList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Httptrigger `json:"items"`
|
|
}
|
|
|
|
// Kubernetes Watches as triggers
|
|
Kuberneteswatchtrigger struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.KubernetesWatchTriggerSpec `json:"spec"`
|
|
}
|
|
KuberneteswatchtriggerList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Kuberneteswatchtrigger `json:"items"`
|
|
}
|
|
|
|
// Time triggers
|
|
Timetrigger struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.TimeTriggerSpec `json:"spec"`
|
|
}
|
|
TimetriggerList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Timetrigger `json:"items"`
|
|
}
|
|
|
|
// Message Queue triggers
|
|
Messagequeuetrigger struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata api.ObjectMeta `json:"metadata"`
|
|
Spec fission.MessageQueueTriggerSpec `json:"spec"`
|
|
}
|
|
MessagequeuetriggerList struct {
|
|
unversioned.TypeMeta `json:",inline"`
|
|
Metadata unversioned.ListMeta `json:"metadata"`
|
|
|
|
Items []Messagequeuetrigger `json:"items"`
|
|
}
|
|
)
|
|
|
|
// Each TPR type needs:
|
|
// GetObjectKind (to satisfy the Object interface)
|
|
//
|
|
// In addition, each singular TPR type needs:
|
|
// GetObjectMeta (to satisfy the ObjectMetaAccessor interface)
|
|
//
|
|
// And each list TPR type needs:
|
|
// GetListMeta (to satisfy the ListMetaAccessor interface)
|
|
|
|
func (f *Function) GetObjectKind() unversioned.ObjectKind {
|
|
return &f.TypeMeta
|
|
}
|
|
func (e *Environment) GetObjectKind() unversioned.ObjectKind {
|
|
return &e.TypeMeta
|
|
}
|
|
func (ht *Httptrigger) GetObjectKind() unversioned.ObjectKind {
|
|
return &ht.TypeMeta
|
|
}
|
|
func (w *Kuberneteswatchtrigger) GetObjectKind() unversioned.ObjectKind {
|
|
return &w.TypeMeta
|
|
}
|
|
func (w *Timetrigger) GetObjectKind() unversioned.ObjectKind {
|
|
return &w.TypeMeta
|
|
}
|
|
func (w *Messagequeuetrigger) GetObjectKind() unversioned.ObjectKind {
|
|
return &w.TypeMeta
|
|
}
|
|
func (w *Package) GetObjectKind() unversioned.ObjectKind {
|
|
return &w.TypeMeta
|
|
}
|
|
|
|
func (f *Function) GetObjectMeta() meta.Object {
|
|
return &f.Metadata
|
|
}
|
|
func (e *Environment) GetObjectMeta() meta.Object {
|
|
return &e.Metadata
|
|
}
|
|
func (ht *Httptrigger) GetObjectMeta() meta.Object {
|
|
return &ht.Metadata
|
|
}
|
|
func (w *Kuberneteswatchtrigger) GetObjectMeta() meta.Object {
|
|
return &w.Metadata
|
|
}
|
|
func (w *Timetrigger) GetObjectMeta() meta.Object {
|
|
return &w.Metadata
|
|
}
|
|
func (w *Messagequeuetrigger) GetObjectMeta() meta.Object {
|
|
return &w.Metadata
|
|
}
|
|
func (w *Package) GetObjectMeta() meta.Object {
|
|
return &w.Metadata
|
|
}
|
|
|
|
func (fl *FunctionList) GetObjectKind() unversioned.ObjectKind {
|
|
return &fl.TypeMeta
|
|
}
|
|
func (el *EnvironmentList) GetObjectKind() unversioned.ObjectKind {
|
|
return &el.TypeMeta
|
|
}
|
|
func (hl *HttptriggerList) GetObjectKind() unversioned.ObjectKind {
|
|
return &hl.TypeMeta
|
|
}
|
|
func (wl *KuberneteswatchtriggerList) GetObjectKind() unversioned.ObjectKind {
|
|
return &wl.TypeMeta
|
|
}
|
|
func (wl *TimetriggerList) GetObjectKind() unversioned.ObjectKind {
|
|
return &wl.TypeMeta
|
|
}
|
|
func (wl *MessagequeuetriggerList) GetObjectKind() unversioned.ObjectKind {
|
|
return &wl.TypeMeta
|
|
}
|
|
func (wl *PackageList) GetObjectKind() unversioned.ObjectKind {
|
|
return &wl.TypeMeta
|
|
}
|
|
|
|
func (fl *FunctionList) GetListMeta() unversioned.List {
|
|
return &fl.Metadata
|
|
}
|
|
func (el *EnvironmentList) GetListMeta() unversioned.List {
|
|
return &el.Metadata
|
|
}
|
|
func (hl *HttptriggerList) GetListMeta() unversioned.List {
|
|
return &hl.Metadata
|
|
}
|
|
func (wl *KuberneteswatchtriggerList) GetListMeta() unversioned.List {
|
|
return &wl.Metadata
|
|
}
|
|
func (wl *TimetriggerList) GetListMeta() unversioned.List {
|
|
return &wl.Metadata
|
|
}
|
|
func (wl *MessagequeuetriggerList) GetListMeta() unversioned.List {
|
|
return &wl.Metadata
|
|
}
|
|
func (wl *PackageList) GetListMeta() unversioned.List {
|
|
return &wl.Metadata
|
|
}
|