Switch from ThirdPartyResources to CustomResourceDefinitions (#381)

Switch Fission's storage over to the new CustomResourceDefinitions, from the deprecated ThirdPartyResources. This allows us to be compatible with Kubernets 1.8 and onwards.

This also adds a CLI tool for dumping state from an old fission version and restoring state into new CRDs.

The storage service is unaffected by this change.
This commit is contained in:
Ta-Ching Chen
2017-11-04 14:55:16 -07:00
committed by Soam Vasani
parent 746c51901d
commit 5f14b9b0ae
76 changed files with 1223 additions and 701 deletions
+1 -1
View File
@@ -10,7 +10,7 @@
## Fission API ([area-api](https://github.com/fission/fission/labels/area-api)) ## Fission API ([area-api](https://github.com/fission/fission/labels/area-api))
- TPR-based controller - CRD-based controller
- API authentication - API authentication
- Aggregated API server - Aggregated API server
+3 -1
View File
@@ -2,4 +2,6 @@
* [Installation guide](install) * [Installation guide](install)
* [Upgrade guide](upgrade-from-v0.1) * [Upgrade guide for v0.1 to v0.2](upgrade-from-v0.1)
* [Upgrade guide for v0.3 to v0.4](upgrade-from-v0.3)
@@ -0,0 +1,126 @@
---
title: "Upgrading from Fission v0.3 to v0.4.x"
date: 2017-11-04T03:38:29+08:00
draft: false
---
## TL;DR
ThirdPartyResource is replaced by CustomResource and will be entirely deprecated in Kubernetes 1.8.
Since Fission stores state in TPR, we need to migrate from TPRs to CRDs for future Kubernetes
release.
Below we describe a tool for migrating your TPRs to CRDs.
## How to Upgrade
1. Get the v0.4-rc CLI
2. Get the Fission state from v0.3 install
3. Upgrade to Fission v0.4.0-rc
4. Upgrade Kubernetes cluster version to 1.7.x or higher
5. Remove all TPR definition (for Kubernetes 1.7.x)
6. Restore Fission state into CRDs
### Get the new CLI
#### OS X
```
$ curl -Lo fission https://github.com/fission/fission/releases/download/v0.4.0-rc/fission-cli-osx && chmod +x fission && sudo mv fission /usr/local/bin/
```
#### Linux
```
$ curl -Lo fission https://github.com/fission/fission/releases/download/v0.4.0-rc/fission-cli-linux && chmod +x fission && sudo mv fission /usr/local/bin/
```
#### Windows
For Windows, you can use the linux binary on WSL. Or you can download
this windows executable: [fission.exe](https://github.com/fission/fission/releases/download/v0.4.0-rc/fission-cli-windows.exe)
### Get Fission state from v0.3 install
```
fission --server <your v0.3 server> tpr2crd dump --file state.json
```
You can skip the --server argument if you have the environment
variable `$FISSION_URL` set to point at a v0.3 Fission server.
This will create a JSON file with all your fission state in the
current directory.
### Upgrade to Fission v0.4.0-rc
Upgrade fission with a command similar to this:
```
helm upgrade fission-all --namespace fission
```
### Upgrade Kubernetes cluster version
Since CustomResource is only supported on Kubernetes v1.7+ and higher, please make sure
that you upgrade to the right version that supports CustomResource.
### Remove all TPR definition (for Kubernetes 1.7.x)
** NOTICE **: This step will remove TPR definition from your kubernetes cluster. Please make sure that you dump all TPRs at the second step!
Though Kubernetes will migrate TPRs to CRDs automatically when TPR definition is deleted if the same name CRD exists. We still need to make sure that there is no resource gets lost during the migration. Also, since we changed the capitalization of some CRDs to CamelCase (e.g. Httptrigger -> HTTPTrigger), we need to recreate those resources by ourselves.
```
fission tpr2crd delete
```
### Restore your Fission state into Fission v0.4.0-rc
```
fission tpr2crd restore --file state.json
```
This commands needs `$FISSION_URL` set to point to new fission installation.
It uses the file created in the first step. It doesn't modify state.json.
(Note that you can run this restore on any cluster; it doesn't have the be the same kubernetes
cluster as your old install.)
### Verify
Let's check the migration result, first run following command to check CRD established state.
```
kubectl get crd -o 'custom-columns=NAME:{.metadata.name},ESTABLISHED:{.status.conditions[?(@.type=="Established")].status}'
```
The output should be like this
```
NAME ESTABLISHED
environments.fission.io True
functions.fission.io True
httptriggers.fission.io True
kuberneteswatchtriggers.fission.io True
messagequeuetriggers.fission.io True
packages.fission.io True
timetriggers.fission.io True
```
And check that CRD resources you expect are there.
```
COMMAND:
fission [resource] list
RESOURCES:
environments
functions
httptriggers
kuberneteswatchtriggers
messagequeuetriggers
packages
timetriggers
```
+3 -3
View File
@@ -30,7 +30,7 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type ( type (
@@ -39,14 +39,14 @@ type (
} }
BuilderMgr struct { BuilderMgr struct {
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
kubernetesClient *kubernetes.Clientset kubernetesClient *kubernetes.Clientset
storageSvcUrl string storageSvcUrl string
namespace string namespace string
} }
) )
func MakeBuilderMgr(fissionClient *tpr.FissionClient, func MakeBuilderMgr(fissionClient *crd.FissionClient,
kubernetesClient *kubernetes.Clientset, storageSvcUrl string, kubernetesClient *kubernetes.Clientset, storageSvcUrl string,
envBuilderNamespace string) *BuilderMgr { envBuilderNamespace string) *BuilderMgr {
+2 -2
View File
@@ -19,12 +19,12 @@ package buildermgr
import ( import (
"log" "log"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
// Start the buildermgr service. // Start the buildermgr service.
func Start(port int, storageSvcUrl string, envBuilderNamespace string) error { func Start(port int, storageSvcUrl string, envBuilderNamespace string) error {
fissionClient, kubernetesClient, err := tpr.MakeFissionClient() fissionClient, kubernetesClient, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Printf("Failed to get kubernetes client: %v", err) log.Printf("Failed to get kubernetes client: %v", err)
return err return err
+18 -17
View File
@@ -28,9 +28,9 @@ import (
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/builder" "github.com/fission/fission/builder"
builderClient "github.com/fission/fission/builder/client" builderClient "github.com/fission/fission/builder/client"
"github.com/fission/fission/crd"
"github.com/fission/fission/environments/fetcher" "github.com/fission/fission/environments/fetcher"
fetcherClient "github.com/fission/fission/environments/fetcher/client" fetcherClient "github.com/fission/fission/environments/fetcher/client"
"github.com/fission/fission/tpr"
) )
// buildPackage helps to build source package into deployment package. // buildPackage helps to build source package into deployment package.
@@ -43,13 +43,13 @@ import (
// 6. Update package status to succeed state // 6. Update package status to succeed state
// 7. Update package resource in package ref of functions that share the same package // 7. Update package resource in package ref of functions that share the same package
// *. Update package status to failed state,if any one of steps above failed // *. Update package status to failed state,if any one of steps above failed
func buildPackage(fissionClient *tpr.FissionClient, kubernetesClient *kubernetes.Clientset, func buildPackage(fissionClient *crd.FissionClient, kubernetesClient *kubernetes.Clientset,
builderNamespace string, storageSvcUrl string, buildReq BuildRequest) (buildLogs string, err error) { builderNamespace string, storageSvcUrl string, buildReq BuildRequest) (buildLogs string, err error) {
pkg, err := fissionClient.Packages( pkg, err := fissionClient.Packages(
buildReq.Package.Namespace).Get(buildReq.Package.Name) buildReq.Package.Namespace).Get(buildReq.Package.Name)
if err != nil { if err != nil {
e := fmt.Sprintf("Error getting function TPR info: %v", err) e := fmt.Sprintf("Error getting function CRD info: %v", err)
log.Println(e) log.Println(e)
updatePackage(fissionClient, pkg, fission.BuildStatusFailed, e, nil) updatePackage(fissionClient, pkg, fission.BuildStatusFailed, e, nil)
return e, fission.MakeError(500, e) return e, fission.MakeError(500, e)
@@ -64,7 +64,14 @@ func buildPackage(fissionClient *tpr.FissionClient, kubernetesClient *kubernetes
// update package status to running state, so that // update package status to running state, so that
// we can know what status a package is through cli. // we can know what status a package is through cli.
_, err = updatePackage(fissionClient, pkg, fission.BuildStatusRunning, "", nil) newPkgRV, err := updatePackage(fissionClient, pkg, fission.BuildStatusRunning, "", nil)
// Kubernetes checks resource version before applying
// new resource config. The update operation will be
// rejected if the resource version in metadata is lower
// than the latest version. Set resource version with
// latest return from updatePackage.
pkg.Metadata.ResourceVersion = newPkgRV
if err != nil { if err != nil {
e := fmt.Sprintf("Error setting package pending state: %v", err) e := fmt.Sprintf("Error setting package pending state: %v", err)
log.Println(e) log.Println(e)
@@ -74,7 +81,7 @@ func buildPackage(fissionClient *tpr.FissionClient, kubernetesClient *kubernetes
env, err := fissionClient.Environments(metav1.NamespaceDefault).Get(pkg.Spec.Environment.Name) env, err := fissionClient.Environments(metav1.NamespaceDefault).Get(pkg.Spec.Environment.Name)
if err != nil { if err != nil {
e := fmt.Sprintf("Error getting environment TPR info: %v", err) e := fmt.Sprintf("Error getting environment CRD info: %v", err)
log.Println(e) log.Println(e)
updatePackage(fissionClient, pkg, fission.BuildStatusFailed, e, nil) updatePackage(fissionClient, pkg, fission.BuildStatusFailed, e, nil)
return e, fission.MakeError(500, e) return e, fission.MakeError(500, e)
@@ -134,10 +141,11 @@ func buildPackage(fissionClient *tpr.FissionClient, kubernetesClient *kubernetes
log.Printf("Start updating info of package: %v", pkg.Metadata.Name) log.Printf("Start updating info of package: %v", pkg.Metadata.Name)
// update package status and also build logs // update package status and also build logs
newPkgRV, err := updatePackage(fissionClient, pkg, newPkgRV, err = updatePackage(fissionClient, pkg,
fission.BuildStatusSucceeded, buildResp.BuildLogs, uploadResp) fission.BuildStatusSucceeded, buildResp.BuildLogs, uploadResp)
pkg.Metadata.ResourceVersion = newPkgRV
if err != nil { if err != nil {
e := fmt.Sprintf("Error creating deployment package TPR resource: %v", err) e := fmt.Sprintf("Error creating deployment package CRD resource: %v", err)
log.Println(e) log.Println(e)
updatePackage(fissionClient, pkg, fission.BuildStatusFailed, e, nil) updatePackage(fissionClient, pkg, fission.BuildStatusFailed, e, nil)
return e, fission.MakeError(500, e) return e, fission.MakeError(500, e)
@@ -159,7 +167,7 @@ func buildPackage(fissionClient *tpr.FissionClient, kubernetesClient *kubernetes
fn.Spec.Package.PackageRef.Namespace == pkg.Metadata.Namespace && fn.Spec.Package.PackageRef.Namespace == pkg.Metadata.Namespace &&
fn.Spec.Package.PackageRef.ResourceVersion != pkg.Metadata.ResourceVersion { fn.Spec.Package.PackageRef.ResourceVersion != pkg.Metadata.ResourceVersion {
fn.Spec.Package.PackageRef.ResourceVersion = newPkgRV fn.Spec.Package.PackageRef.ResourceVersion = newPkgRV
// update TPR // update CRD
_, err = fissionClient.Functions(fn.Metadata.Namespace).Update(&fn) _, err = fissionClient.Functions(fn.Metadata.Namespace).Update(&fn)
if err != nil { if err != nil {
e := fmt.Sprintf("Error updating function package resource version: %v", err) e := fmt.Sprintf("Error updating function package resource version: %v", err)
@@ -175,17 +183,10 @@ func buildPackage(fissionClient *tpr.FissionClient, kubernetesClient *kubernetes
return buildResp.BuildLogs, nil return buildResp.BuildLogs, nil
} }
func updatePackage(fissionClient *tpr.FissionClient, func updatePackage(fissionClient *crd.FissionClient,
pkg *tpr.Package, status fission.BuildStatus, buildLogs string, pkg *crd.Package, status fission.BuildStatus, buildLogs string,
uploadResp *fetcher.UploadResponse) (string, error) { uploadResp *fetcher.UploadResponse) (string, error) {
// Kubernetes checks resource version before applying
// new resource config. The update operation will be
// rejected if the resource version in metadata is lower
// than the latest version. Set resource version empty
// string to skip resource version check.
pkg.Metadata.ResourceVersion = ""
pkg.Status = fission.PackageStatus{ pkg.Status = fission.PackageStatus{
BuildStatus: status, BuildStatus: status,
BuildLog: buildLogs, BuildLog: buildLogs,
+14 -14
View File
@@ -30,7 +30,7 @@ import (
apiv1 "k8s.io/client-go/pkg/api/v1" apiv1 "k8s.io/client-go/pkg/api/v1"
"k8s.io/client-go/pkg/apis/extensions/v1beta1" "k8s.io/client-go/pkg/apis/extensions/v1beta1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type requestType int type requestType int
@@ -52,8 +52,8 @@ type (
envwRequest struct { envwRequest struct {
requestType requestType
env *tpr.Environment env *crd.Environment
envList []tpr.Environment envList []crd.Environment
respChan chan envwResponse respChan chan envwResponse
} }
@@ -66,14 +66,14 @@ type (
cache map[string]*builderInfo cache map[string]*builderInfo
requestChan chan envwRequest requestChan chan envwRequest
builderNamespace string builderNamespace string
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
kubernetesClient *kubernetes.Clientset kubernetesClient *kubernetes.Clientset
fetcherImage string fetcherImage string
fetcherImagePullPolicy apiv1.PullPolicy fetcherImagePullPolicy apiv1.PullPolicy
} }
) )
func makeEnvironmentWatcher(fissionClient *tpr.FissionClient, func makeEnvironmentWatcher(fissionClient *crd.FissionClient,
kubernetesClient *kubernetes.Clientset, builderNamespace string) *environmentWatcher { kubernetesClient *kubernetes.Clientset, builderNamespace string) *environmentWatcher {
fetcherImage := os.Getenv("FETCHER_IMAGE") fetcherImage := os.Getenv("FETCHER_IMAGE")
@@ -144,7 +144,7 @@ func (envw *environmentWatcher) watchEnvironments() {
time.Sleep(time.Second) time.Sleep(time.Second)
break break
} }
env := ev.Object.(*tpr.Environment) env := ev.Object.(*crd.Environment)
rv = env.Metadata.ResourceVersion rv = env.Metadata.ResourceVersion
envw.sync() envw.sync()
} }
@@ -154,7 +154,7 @@ func (envw *environmentWatcher) watchEnvironments() {
func (envw *environmentWatcher) sync() { func (envw *environmentWatcher) sync() {
envList, err := envw.fissionClient.Environments(metav1.NamespaceAll).List(metav1.ListOptions{}) envList, err := envw.fissionClient.Environments(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
log.Fatalf("Error syncing environment TPR resources: %v", err) log.Fatalf("Error syncing environment CRD resources: %v", err)
} }
// Create environment builders for all environments // Create environment builders for all environments
@@ -191,7 +191,7 @@ func (envw *environmentWatcher) service() {
req.respChan <- envwResponse{builderInfo: builderInfo} req.respChan <- envwResponse{builderInfo: builderInfo}
case CLEANUP_BUILDERS: case CLEANUP_BUILDERS:
latestEnvList := make(map[string]*tpr.Environment) latestEnvList := make(map[string]*crd.Environment)
for i := range req.envList { for i := range req.envList {
env := req.envList[i] env := req.envList[i]
key := envw.getCacheKey(env.Metadata.Name, env.Metadata.ResourceVersion) key := envw.getCacheKey(env.Metadata.Name, env.Metadata.ResourceVersion)
@@ -201,7 +201,7 @@ func (envw *environmentWatcher) service() {
// If an environment is deleted when builder manager down, // If an environment is deleted when builder manager down,
// the builder belongs to the environment will be out-of- // the builder belongs to the environment will be out-of-
// control (an orphan builder) since there is no record in // control (an orphan builder) since there is no record in
// cache and TPR. We need to iterate over the services & // cache and CRD. We need to iterate over the services &
// deployments to remove both normal and orphan builders. // deployments to remove both normal and orphan builders.
svcList, err := envw.getBuilderServiceList(nil) svcList, err := envw.getBuilderServiceList(nil)
@@ -241,7 +241,7 @@ func (envw *environmentWatcher) service() {
} }
} }
func (envw *environmentWatcher) getEnvBuilder(env *tpr.Environment) (*builderInfo, error) { func (envw *environmentWatcher) getEnvBuilder(env *crd.Environment) (*builderInfo, error) {
respChan := make(chan envwResponse) respChan := make(chan envwResponse)
envw.requestChan <- envwRequest{ envw.requestChan <- envwRequest{
requestType: GET_BUILDER, requestType: GET_BUILDER,
@@ -252,14 +252,14 @@ func (envw *environmentWatcher) getEnvBuilder(env *tpr.Environment) (*builderInf
return resp.builderInfo, resp.err return resp.builderInfo, resp.err
} }
func (envw *environmentWatcher) cleanupEnvBuilders(envs []tpr.Environment) { func (envw *environmentWatcher) cleanupEnvBuilders(envs []crd.Environment) {
envw.requestChan <- envwRequest{ envw.requestChan <- envwRequest{
requestType: CLEANUP_BUILDERS, requestType: CLEANUP_BUILDERS,
envList: envs, envList: envs,
} }
} }
func (envw *environmentWatcher) createBuilder(env *tpr.Environment) (*builderInfo, error) { func (envw *environmentWatcher) createBuilder(env *crd.Environment) (*builderInfo, error) {
var svc *apiv1.Service var svc *apiv1.Service
var deploy *v1beta1.Deployment var deploy *v1beta1.Deployment
@@ -353,7 +353,7 @@ func (envw *environmentWatcher) getBuilderServiceList(sel map[string]string) ([]
return svcList.Items, nil return svcList.Items, nil
} }
func (envw *environmentWatcher) createBuilderService(env *tpr.Environment) (*apiv1.Service, error) { func (envw *environmentWatcher) createBuilderService(env *crd.Environment) (*apiv1.Service, error) {
name := envw.getCacheKey(env.Metadata.Name, env.Metadata.ResourceVersion) name := envw.getCacheKey(env.Metadata.Name, env.Metadata.ResourceVersion)
sel := envw.getLabels(env.Metadata.Name, env.Metadata.ResourceVersion) sel := envw.getLabels(env.Metadata.Name, env.Metadata.ResourceVersion)
service := apiv1.Service{ service := apiv1.Service{
@@ -406,7 +406,7 @@ func (envw *environmentWatcher) getBuilderDeploymentList(sel map[string]string)
return deployList.Items, nil return deployList.Items, nil
} }
func (envw *environmentWatcher) createBuilderDeployment(env *tpr.Environment) (*v1beta1.Deployment, error) { func (envw *environmentWatcher) createBuilderDeployment(env *crd.Environment) (*v1beta1.Deployment, error) {
sharedMountPath := "/package" sharedMountPath := "/package"
name := envw.getCacheKey(env.Metadata.Name, env.Metadata.ResourceVersion) name := envw.getCacheKey(env.Metadata.Name, env.Metadata.ResourceVersion)
sel := envw.getLabels(env.Metadata.Name, env.Metadata.ResourceVersion) sel := envw.getLabels(env.Metadata.Name, env.Metadata.ResourceVersion)
+5 -5
View File
@@ -25,19 +25,19 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type ( type (
packageWatcher struct { packageWatcher struct {
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
kubernetesClient *kubernetes.Clientset kubernetesClient *kubernetes.Clientset
builderNamespace string builderNamespace string
storageSvcUrl string storageSvcUrl string
} }
) )
func makePackageWatcher(fissionClient *tpr.FissionClient, func makePackageWatcher(fissionClient *crd.FissionClient,
kubernetesClient *kubernetes.Clientset, builderNamespace string, storageSvcUrl string) *packageWatcher { kubernetesClient *kubernetes.Clientset, builderNamespace string, storageSvcUrl string) *packageWatcher {
pkgw := &packageWatcher{ pkgw := &packageWatcher{
fissionClient: fissionClient, fissionClient: fissionClient,
@@ -66,7 +66,7 @@ func (pkgw *packageWatcher) watchPackages() {
ResourceVersion: rv, ResourceVersion: rv,
}) })
if err != nil { if err != nil {
log.Fatalf("Error watching package TPR resources: %v", err) log.Fatalf("Error watching package CRD resources: %v", err)
} }
for { for {
@@ -79,7 +79,7 @@ func (pkgw *packageWatcher) watchPackages() {
time.Sleep(time.Second) time.Sleep(time.Second)
break break
} }
pkg := ev.Object.(*tpr.Package) pkg := ev.Object.(*crd.Package)
rv = pkg.Metadata.ResourceVersion rv = pkg.Metadata.ResourceVersion
// only do build for packages in pending state // only do build for packages in pending state
+3 -3
View File
@@ -131,7 +131,7 @@ roleRef:
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: metadata:
name: fission-tpr name: fission-crd
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: fission-svc name: fission-svc
@@ -152,7 +152,7 @@ metadata:
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: metadata:
name: fission-fetcher-tpr name: fission-fetcher-crd
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: fission-fetcher name: fission-fetcher
@@ -173,7 +173,7 @@ metadata:
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: metadata:
name: fission-builder-tpr name: fission-builder-crd
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: fission-builder name: fission-builder
@@ -131,7 +131,7 @@ roleRef:
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: metadata:
name: fission-tpr name: fission-crd
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: fission-svc name: fission-svc
@@ -152,7 +152,7 @@ metadata:
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: metadata:
name: fission-fetcher-tpr name: fission-fetcher-crd
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: fission-fetcher name: fission-fetcher
@@ -173,7 +173,7 @@ metadata:
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1 apiVersion: rbac.authorization.k8s.io/v1beta1
metadata: metadata:
name: fission-builder-tpr name: fission-builder-crd
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: fission-builder name: fission-builder
+5 -3
View File
@@ -30,13 +30,13 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
"github.com/fission/fission/fission/logdb" "github.com/fission/fission/fission/logdb"
"github.com/fission/fission/tpr"
) )
type ( type (
API struct { API struct {
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
kubernetesClient *kubernetes.Clientset kubernetesClient *kubernetes.Clientset
storageServiceUrl string storageServiceUrl string
builderManagerUrl string builderManagerUrl string
@@ -51,7 +51,7 @@ type (
) )
func MakeAPI() (*API, error) { func MakeAPI() (*API, error) {
api, err := makeTPRBackedAPI() api, err := makeCRDBackedAPI()
u := os.Getenv("STORAGE_SERVICE_URL") u := os.Getenv("STORAGE_SERVICE_URL")
if len(u) > 0 { if len(u) > 0 {
@@ -176,6 +176,8 @@ func (api *API) Serve(port int) {
r.HandleFunc("/v2/triggers/messagequeue/{mqTrigger}", api.MessageQueueTriggerApiUpdate).Methods("PUT") r.HandleFunc("/v2/triggers/messagequeue/{mqTrigger}", api.MessageQueueTriggerApiUpdate).Methods("PUT")
r.HandleFunc("/v2/triggers/messagequeue/{mqTrigger}", api.MessageQueueTriggerApiDelete).Methods("DELETE") r.HandleFunc("/v2/triggers/messagequeue/{mqTrigger}", api.MessageQueueTriggerApiDelete).Methods("DELETE")
r.HandleFunc("/v2/deleteTpr", api.Tpr2crdApi).Methods("DELETE")
r.HandleFunc("/proxy/{dbType}", api.FunctionLogsApiPost).Methods("POST") r.HandleFunc("/proxy/{dbType}", api.FunctionLogsApiPost).Methods("POST")
r.HandleFunc("/proxy/storage/v1/archive", api.StorageServiceProxy) r.HandleFunc("/proxy/storage/v1/archive", api.StorageServiceProxy)
r.HandleFunc("/proxy/buildermgr/v1/build", api.BuilderManagerBuildProxy) r.HandleFunc("/proxy/buildermgr/v1/build", api.BuilderManagerBuildProxy)
+30 -25
View File
@@ -18,6 +18,7 @@ package controller
import ( import (
"flag" "flag"
"fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"net/http" "net/http"
@@ -29,7 +30,7 @@ import (
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/controller/client" "github.com/fission/fission/controller/client"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
var g struct { var g struct {
@@ -72,12 +73,9 @@ func assertCronSpecFails(err error) {
} }
func TestFunctionApi(t *testing.T) { func TestFunctionApi(t *testing.T) {
name1 := "foo" testFunc := &crd.Function{
name2 := "bar"
testFunc := &tpr.Function{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: name1, Name: "foo",
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
}, },
Spec: fission.FunctionSpec{ Spec: fission.FunctionSpec{
@@ -95,24 +93,30 @@ func TestFunctionApi(t *testing.T) {
}) })
assertNotFoundFailure(err, "function") assertNotFoundFailure(err, "function")
_, err = g.client.FunctionCreate(testFunc) m, err := g.client.FunctionCreate(testFunc)
panicIf(err) panicIf(err)
defer func() {
err := g.client.FunctionDelete(m)
panicIf(err)
}()
_, err = g.client.FunctionCreate(testFunc) _, err = g.client.FunctionCreate(testFunc)
assertNameReuseFailure(err, "function") assertNameReuseFailure(err, "function")
testFunc.Metadata.ResourceVersion = m.ResourceVersion
testFunc.Spec.Package.FunctionName = "yyy" testFunc.Spec.Package.FunctionName = "yyy"
_, err = g.client.FunctionUpdate(testFunc) _, err = g.client.FunctionUpdate(testFunc)
panicIf(err) panicIf(err)
testFunc.Metadata.Name = name2 testFunc.Metadata.ResourceVersion = ""
_, err = g.client.FunctionCreate(testFunc) testFunc.Metadata.Name = "bar"
m2, err := g.client.FunctionCreate(testFunc)
panicIf(err) panicIf(err)
defer g.client.FunctionDelete(m2)
funcs, err := g.client.FunctionList() funcs, err := g.client.FunctionList()
panicIf(err) panicIf(err)
assert(len(funcs) == 2, assert(len(funcs) == 2, fmt.Sprintf("created two functions, but found %v", len(funcs)))
"created two functions, but didn't find them")
funcs_url := g.client.Url + "/v2/functions" funcs_url := g.client.Url + "/v2/functions"
resp, err := http.Get(funcs_url) resp, err := http.Get(funcs_url)
@@ -127,15 +131,10 @@ func TestFunctionApi(t *testing.T) {
} }
} }
assert(found, "incorrect response content type") assert(found, "incorrect response content type")
err = g.client.FunctionDelete(&metav1.ObjectMeta{Name: name1, Namespace: metav1.NamespaceDefault})
panicIf(err)
err = g.client.FunctionDelete(&metav1.ObjectMeta{Name: name2, Namespace: metav1.NamespaceDefault})
panicIf(err)
} }
func TestHTTPTriggerApi(t *testing.T) { func TestHTTPTriggerApi(t *testing.T) {
testTrigger := &tpr.Httptrigger{ testTrigger := &crd.HTTPTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -165,10 +164,12 @@ func TestHTTPTriggerApi(t *testing.T) {
panicIf(err) panicIf(err)
assert(testTrigger.Spec == tr.Spec, "trigger should match after reading") assert(testTrigger.Spec == tr.Spec, "trigger should match after reading")
testTrigger.Metadata.ResourceVersion = m.ResourceVersion
testTrigger.Spec.RelativeURL = "/hi" testTrigger.Spec.RelativeURL = "/hi"
_, err = g.client.HTTPTriggerUpdate(testTrigger) _, err = g.client.HTTPTriggerUpdate(testTrigger)
panicIf(err) panicIf(err)
testTrigger.Metadata.ResourceVersion = ""
testTrigger.Metadata.Name = "yyy" testTrigger.Metadata.Name = "yyy"
_, err = g.client.HTTPTriggerCreate(testTrigger) _, err = g.client.HTTPTriggerCreate(testTrigger)
assert(err != nil, "duplicate trigger should not be allowed") assert(err != nil, "duplicate trigger should not be allowed")
@@ -180,11 +181,11 @@ func TestHTTPTriggerApi(t *testing.T) {
ts, err := g.client.HTTPTriggerList() ts, err := g.client.HTTPTriggerList()
panicIf(err) panicIf(err)
assert(len(ts) == 2, "created two triggers, but didn't find them") assert(len(ts) == 2, fmt.Sprintf("created two triggers, but found %v", len(ts)))
} }
func TestEnvironmentApi(t *testing.T) { func TestEnvironmentApi(t *testing.T) {
testEnv := &tpr.Environment{ testEnv := &crd.Environment{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "foo", Name: "foo",
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -212,10 +213,12 @@ func TestEnvironmentApi(t *testing.T) {
panicIf(err) panicIf(err)
assert(testEnv.Spec == e.Spec, "env should match after reading") assert(testEnv.Spec == e.Spec, "env should match after reading")
testEnv.Metadata.ResourceVersion = m.ResourceVersion
testEnv.Spec.Runtime.Image = "another-img" testEnv.Spec.Runtime.Image = "another-img"
_, err = g.client.EnvironmentUpdate(testEnv) _, err = g.client.EnvironmentUpdate(testEnv)
panicIf(err) panicIf(err)
testEnv.Metadata.ResourceVersion = ""
testEnv.Metadata.Name = "bar" testEnv.Metadata.Name = "bar"
m2, err := g.client.EnvironmentCreate(testEnv) m2, err := g.client.EnvironmentCreate(testEnv)
panicIf(err) panicIf(err)
@@ -223,11 +226,11 @@ func TestEnvironmentApi(t *testing.T) {
ts, err := g.client.EnvironmentList() ts, err := g.client.EnvironmentList()
panicIf(err) panicIf(err)
assert(len(ts) == 2, "created two envs, but didn't find them") assert(len(ts) == 2, fmt.Sprintf("created two envs, but found %v", len(ts)))
} }
func TestWatchApi(t *testing.T) { func TestWatchApi(t *testing.T) {
testWatch := &tpr.Kuberneteswatchtrigger{ testWatch := &crd.KubernetesWatchTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "xxx", Name: "xxx",
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -267,11 +270,11 @@ func TestWatchApi(t *testing.T) {
ws, err := g.client.WatchList() ws, err := g.client.WatchList()
panicIf(err) panicIf(err)
assert(len(ws) == 2, "created two envs, but didn't find them") assert(len(ws) == 2, fmt.Sprintf("created two watches, but found %v", len(ws)))
} }
func TestTimeTriggerApi(t *testing.T) { func TestTimeTriggerApi(t *testing.T) {
testTrigger := &tpr.Timetrigger{ testTrigger := &crd.TimeTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "xxx", Name: "xxx",
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -298,10 +301,12 @@ func TestTimeTriggerApi(t *testing.T) {
panicIf(err) panicIf(err)
assert(testTrigger.Spec == tr.Spec, "trigger should match after reading") assert(testTrigger.Spec == tr.Spec, "trigger should match after reading")
testTrigger.Metadata.ResourceVersion = m.ResourceVersion
testTrigger.Spec.Cron = "@hourly" testTrigger.Spec.Cron = "@hourly"
_, err = g.client.TimeTriggerUpdate(testTrigger) _, err = g.client.TimeTriggerUpdate(testTrigger)
panicIf(err) panicIf(err)
testTrigger.Metadata.ResourceVersion = ""
testTrigger.Metadata.Name = "yyy" testTrigger.Metadata.Name = "yyy"
testTrigger.Spec.Cron = "Not valid cron spec" testTrigger.Spec.Cron = "Not valid cron spec"
_, err = g.client.TimeTriggerCreate(testTrigger) _, err = g.client.TimeTriggerCreate(testTrigger)
@@ -309,7 +314,7 @@ func TestTimeTriggerApi(t *testing.T) {
ts, err := g.client.TimeTriggerList() ts, err := g.client.TimeTriggerList()
panicIf(err) panicIf(err)
assert(len(ts) == 1, "created one trigger, but didn't find it") assert(len(ts) == 1, fmt.Sprintf("created two time triggers, but found %v", len(ts)))
} }
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
@@ -324,7 +329,7 @@ func TestMain(m *testing.M) {
go Start(8888) go Start(8888)
time.Sleep(time.Second) time.Sleep(5 * time.Second)
g.client = client.MakeClient("http://localhost:8888") g.client = client.MakeClient("http://localhost:8888")
resp, err := http.Get("http://localhost:8888/") resp, err := http.Get("http://localhost:8888/")
+7 -7
View File
@@ -24,10 +24,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) EnvironmentCreate(env *tpr.Environment) (*metav1.ObjectMeta, error) { func (c *Client) EnvironmentCreate(env *crd.Environment) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(env) reqbody, err := json.Marshal(env)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -53,7 +53,7 @@ func (c *Client) EnvironmentCreate(env *tpr.Environment) (*metav1.ObjectMeta, er
return &m, nil return &m, nil
} }
func (c *Client) EnvironmentGet(m *metav1.ObjectMeta) (*tpr.Environment, error) { func (c *Client) EnvironmentGet(m *metav1.ObjectMeta) (*crd.Environment, error) {
relativeUrl := fmt.Sprintf("environments/%v", m.Name) relativeUrl := fmt.Sprintf("environments/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -68,7 +68,7 @@ func (c *Client) EnvironmentGet(m *metav1.ObjectMeta) (*tpr.Environment, error)
return nil, err return nil, err
} }
var env tpr.Environment var env crd.Environment
err = json.Unmarshal(body, &env) err = json.Unmarshal(body, &env)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -77,7 +77,7 @@ func (c *Client) EnvironmentGet(m *metav1.ObjectMeta) (*tpr.Environment, error)
return &env, nil return &env, nil
} }
func (c *Client) EnvironmentUpdate(env *tpr.Environment) (*metav1.ObjectMeta, error) { func (c *Client) EnvironmentUpdate(env *crd.Environment) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(env) reqbody, err := json.Marshal(env)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -110,7 +110,7 @@ func (c *Client) EnvironmentDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) EnvironmentList() ([]tpr.Environment, error) { func (c *Client) EnvironmentList() ([]crd.Environment, error) {
resp, err := http.Get(c.url("environments")) resp, err := http.Get(c.url("environments"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -122,7 +122,7 @@ func (c *Client) EnvironmentList() ([]tpr.Environment, error) {
return nil, err return nil, err
} }
envs := make([]tpr.Environment, 0) envs := make([]crd.Environment, 0)
err = json.Unmarshal(body, &envs) err = json.Unmarshal(body, &envs)
if err != nil { if err != nil {
return nil, err return nil, err
+7 -7
View File
@@ -24,10 +24,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) FunctionCreate(f *tpr.Function) (*metav1.ObjectMeta, error) { func (c *Client) FunctionCreate(f *crd.Function) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(f) reqbody, err := json.Marshal(f)
if err != nil { if err != nil {
@@ -54,7 +54,7 @@ func (c *Client) FunctionCreate(f *tpr.Function) (*metav1.ObjectMeta, error) {
return &m, nil return &m, nil
} }
func (c *Client) FunctionGet(m *metav1.ObjectMeta) (*tpr.Function, error) { func (c *Client) FunctionGet(m *metav1.ObjectMeta) (*crd.Function, error) {
relativeUrl := fmt.Sprintf("functions/%v", m.Name) relativeUrl := fmt.Sprintf("functions/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -69,7 +69,7 @@ func (c *Client) FunctionGet(m *metav1.ObjectMeta) (*tpr.Function, error) {
return nil, err return nil, err
} }
var f tpr.Function var f crd.Function
err = json.Unmarshal(body, &f) err = json.Unmarshal(body, &f)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -92,7 +92,7 @@ func (c *Client) FunctionGetRawDeployment(m *metav1.ObjectMeta) ([]byte, error)
return c.handleResponse(resp) return c.handleResponse(resp)
} }
func (c *Client) FunctionUpdate(f *tpr.Function) (*metav1.ObjectMeta, error) { func (c *Client) FunctionUpdate(f *crd.Function) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(f) reqbody, err := json.Marshal(f)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -124,7 +124,7 @@ func (c *Client) FunctionDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) FunctionList() ([]tpr.Function, error) { func (c *Client) FunctionList() ([]crd.Function, error) {
resp, err := http.Get(c.url("functions")) resp, err := http.Get(c.url("functions"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -136,7 +136,7 @@ func (c *Client) FunctionList() ([]tpr.Function, error) {
return nil, err return nil, err
} }
funcs := make([]tpr.Function, 0) funcs := make([]crd.Function, 0)
err = json.Unmarshal(body, &funcs) err = json.Unmarshal(body, &funcs)
if err != nil { if err != nil {
return nil, err return nil, err
+7 -7
View File
@@ -24,10 +24,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) HTTPTriggerCreate(t *tpr.Httptrigger) (*metav1.ObjectMeta, error) { func (c *Client) HTTPTriggerCreate(t *crd.HTTPTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(t) reqbody, err := json.Marshal(t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -53,7 +53,7 @@ func (c *Client) HTTPTriggerCreate(t *tpr.Httptrigger) (*metav1.ObjectMeta, erro
return &m, nil return &m, nil
} }
func (c *Client) HTTPTriggerGet(m *metav1.ObjectMeta) (*tpr.Httptrigger, error) { func (c *Client) HTTPTriggerGet(m *metav1.ObjectMeta) (*crd.HTTPTrigger, error) {
relativeUrl := fmt.Sprintf("triggers/http/%v", m.Name) relativeUrl := fmt.Sprintf("triggers/http/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -68,7 +68,7 @@ func (c *Client) HTTPTriggerGet(m *metav1.ObjectMeta) (*tpr.Httptrigger, error)
return nil, err return nil, err
} }
var t tpr.Httptrigger var t crd.HTTPTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -77,7 +77,7 @@ func (c *Client) HTTPTriggerGet(m *metav1.ObjectMeta) (*tpr.Httptrigger, error)
return &t, nil return &t, nil
} }
func (c *Client) HTTPTriggerUpdate(t *tpr.Httptrigger) (*metav1.ObjectMeta, error) { func (c *Client) HTTPTriggerUpdate(t *crd.HTTPTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(t) reqbody, err := json.Marshal(t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -109,7 +109,7 @@ func (c *Client) HTTPTriggerDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) HTTPTriggerList() ([]tpr.Httptrigger, error) { func (c *Client) HTTPTriggerList() ([]crd.HTTPTrigger, error) {
resp, err := http.Get(c.url("triggers/http")) resp, err := http.Get(c.url("triggers/http"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -121,7 +121,7 @@ func (c *Client) HTTPTriggerList() ([]tpr.Httptrigger, error) {
return nil, err return nil, err
} }
triggers := make([]tpr.Httptrigger, 0) triggers := make([]crd.HTTPTrigger, 0)
err = json.Unmarshal(body, &triggers) err = json.Unmarshal(body, &triggers)
if err != nil { if err != nil {
return nil, err return nil, err
+7 -7
View File
@@ -25,10 +25,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) WatchCreate(w *tpr.Kuberneteswatchtrigger) (*metav1.ObjectMeta, error) { func (c *Client) WatchCreate(w *crd.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(w) reqbody, err := json.Marshal(w)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -54,7 +54,7 @@ func (c *Client) WatchCreate(w *tpr.Kuberneteswatchtrigger) (*metav1.ObjectMeta,
return &m, nil return &m, nil
} }
func (c *Client) WatchGet(m *metav1.ObjectMeta) (*tpr.Kuberneteswatchtrigger, error) { func (c *Client) WatchGet(m *metav1.ObjectMeta) (*crd.KubernetesWatchTrigger, error) {
relativeUrl := fmt.Sprintf("watches/%v", m.Name) relativeUrl := fmt.Sprintf("watches/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -69,7 +69,7 @@ func (c *Client) WatchGet(m *metav1.ObjectMeta) (*tpr.Kuberneteswatchtrigger, er
return nil, err return nil, err
} }
var w tpr.Kuberneteswatchtrigger var w crd.KubernetesWatchTrigger
err = json.Unmarshal(body, &w) err = json.Unmarshal(body, &w)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -78,7 +78,7 @@ func (c *Client) WatchGet(m *metav1.ObjectMeta) (*tpr.Kuberneteswatchtrigger, er
return &w, nil return &w, nil
} }
func (c *Client) WatchUpdate(w *tpr.Kuberneteswatchtrigger) (*metav1.ObjectMeta, error) { func (c *Client) WatchUpdate(w *crd.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) {
return nil, fission.MakeError(fission.ErrorNotImplmented, return nil, fission.MakeError(fission.ErrorNotImplmented,
"watch update not implemented") "watch update not implemented")
} }
@@ -89,7 +89,7 @@ func (c *Client) WatchDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) WatchList() ([]tpr.Kuberneteswatchtrigger, error) { func (c *Client) WatchList() ([]crd.KubernetesWatchTrigger, error) {
resp, err := http.Get(c.url("watches")) resp, err := http.Get(c.url("watches"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -101,7 +101,7 @@ func (c *Client) WatchList() ([]tpr.Kuberneteswatchtrigger, error) {
return nil, err return nil, err
} }
watches := make([]tpr.Kuberneteswatchtrigger, 0) watches := make([]crd.KubernetesWatchTrigger, 0)
err = json.Unmarshal(body, &watches) err = json.Unmarshal(body, &watches)
if err != nil { if err != nil {
return nil, err return nil, err
+7 -7
View File
@@ -24,10 +24,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) MessageQueueTriggerCreate(t *tpr.Messagequeuetrigger) (*metav1.ObjectMeta, error) { func (c *Client) MessageQueueTriggerCreate(t *crd.MessageQueueTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(t) reqbody, err := json.Marshal(t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -53,7 +53,7 @@ func (c *Client) MessageQueueTriggerCreate(t *tpr.Messagequeuetrigger) (*metav1.
return &m, nil return &m, nil
} }
func (c *Client) MessageQueueTriggerGet(m *metav1.ObjectMeta) (*tpr.Messagequeuetrigger, error) { func (c *Client) MessageQueueTriggerGet(m *metav1.ObjectMeta) (*crd.MessageQueueTrigger, error) {
relativeUrl := fmt.Sprintf("triggers/messagequeue/%v", m.Name) relativeUrl := fmt.Sprintf("triggers/messagequeue/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -68,7 +68,7 @@ func (c *Client) MessageQueueTriggerGet(m *metav1.ObjectMeta) (*tpr.Messagequeue
return nil, err return nil, err
} }
var t tpr.Messagequeuetrigger var t crd.MessageQueueTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -77,7 +77,7 @@ func (c *Client) MessageQueueTriggerGet(m *metav1.ObjectMeta) (*tpr.Messagequeue
return &t, nil return &t, nil
} }
func (c *Client) MessageQueueTriggerUpdate(mqTrigger *tpr.Messagequeuetrigger) (*metav1.ObjectMeta, error) { func (c *Client) MessageQueueTriggerUpdate(mqTrigger *crd.MessageQueueTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(mqTrigger) reqbody, err := json.Marshal(mqTrigger)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -109,7 +109,7 @@ func (c *Client) MessageQueueTriggerDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) MessageQueueTriggerList(mqType string) ([]tpr.Messagequeuetrigger, error) { func (c *Client) MessageQueueTriggerList(mqType string) ([]crd.MessageQueueTrigger, error) {
relativeUrl := "triggers/messagequeue" relativeUrl := "triggers/messagequeue"
if len(mqType) > 0 { if len(mqType) > 0 {
// TODO remove this, replace with field selector // TODO remove this, replace with field selector
@@ -127,7 +127,7 @@ func (c *Client) MessageQueueTriggerList(mqType string) ([]tpr.Messagequeuetrigg
return nil, err return nil, err
} }
triggers := make([]tpr.Messagequeuetrigger, 0) triggers := make([]crd.MessageQueueTrigger, 0)
err = json.Unmarshal(body, &triggers) err = json.Unmarshal(body, &triggers)
if err != nil { if err != nil {
return nil, err return nil, err
+7 -7
View File
@@ -24,10 +24,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) PackageCreate(f *tpr.Package) (*metav1.ObjectMeta, error) { func (c *Client) PackageCreate(f *crd.Package) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(f) reqbody, err := json.Marshal(f)
if err != nil { if err != nil {
@@ -54,7 +54,7 @@ func (c *Client) PackageCreate(f *tpr.Package) (*metav1.ObjectMeta, error) {
return &m, nil return &m, nil
} }
func (c *Client) PackageGet(m *metav1.ObjectMeta) (*tpr.Package, error) { func (c *Client) PackageGet(m *metav1.ObjectMeta) (*crd.Package, error) {
relativeUrl := fmt.Sprintf("packages/%v", m.Name) relativeUrl := fmt.Sprintf("packages/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -69,7 +69,7 @@ func (c *Client) PackageGet(m *metav1.ObjectMeta) (*tpr.Package, error) {
return nil, err return nil, err
} }
var f tpr.Package var f crd.Package
err = json.Unmarshal(body, &f) err = json.Unmarshal(body, &f)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -78,7 +78,7 @@ func (c *Client) PackageGet(m *metav1.ObjectMeta) (*tpr.Package, error) {
return &f, nil return &f, nil
} }
func (c *Client) PackageUpdate(f *tpr.Package) (*metav1.ObjectMeta, error) { func (c *Client) PackageUpdate(f *crd.Package) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(f) reqbody, err := json.Marshal(f)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -110,7 +110,7 @@ func (c *Client) PackageDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) PackageList() ([]tpr.Package, error) { func (c *Client) PackageList() ([]crd.Package, error) {
resp, err := http.Get(c.url("packages")) resp, err := http.Get(c.url("packages"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -122,7 +122,7 @@ func (c *Client) PackageList() ([]tpr.Package, error) {
return nil, err return nil, err
} }
funcs := make([]tpr.Package, 0) funcs := make([]crd.Package, 0)
err = json.Unmarshal(body, &funcs) err = json.Unmarshal(body, &funcs)
if err != nil { if err != nil {
return nil, err return nil, err
+7 -7
View File
@@ -24,10 +24,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (c *Client) TimeTriggerCreate(t *tpr.Timetrigger) (*metav1.ObjectMeta, error) { func (c *Client) TimeTriggerCreate(t *crd.TimeTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(t) reqbody, err := json.Marshal(t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -53,7 +53,7 @@ func (c *Client) TimeTriggerCreate(t *tpr.Timetrigger) (*metav1.ObjectMeta, erro
return &m, nil return &m, nil
} }
func (c *Client) TimeTriggerGet(m *metav1.ObjectMeta) (*tpr.Timetrigger, error) { func (c *Client) TimeTriggerGet(m *metav1.ObjectMeta) (*crd.TimeTrigger, error) {
relativeUrl := fmt.Sprintf("triggers/time/%v", m.Name) relativeUrl := fmt.Sprintf("triggers/time/%v", m.Name)
relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace)
@@ -68,7 +68,7 @@ func (c *Client) TimeTriggerGet(m *metav1.ObjectMeta) (*tpr.Timetrigger, error)
return nil, err return nil, err
} }
var t tpr.Timetrigger var t crd.TimeTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -77,7 +77,7 @@ func (c *Client) TimeTriggerGet(m *metav1.ObjectMeta) (*tpr.Timetrigger, error)
return &t, nil return &t, nil
} }
func (c *Client) TimeTriggerUpdate(t *tpr.Timetrigger) (*metav1.ObjectMeta, error) { func (c *Client) TimeTriggerUpdate(t *crd.TimeTrigger) (*metav1.ObjectMeta, error) {
reqbody, err := json.Marshal(t) reqbody, err := json.Marshal(t)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -109,7 +109,7 @@ func (c *Client) TimeTriggerDelete(m *metav1.ObjectMeta) error {
return c.delete(relativeUrl) return c.delete(relativeUrl)
} }
func (c *Client) TimeTriggerList() ([]tpr.Timetrigger, error) { func (c *Client) TimeTriggerList() ([]crd.TimeTrigger, error) {
resp, err := http.Get(c.url("triggers/time")) resp, err := http.Get(c.url("triggers/time"))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -121,7 +121,7 @@ func (c *Client) TimeTriggerList() ([]tpr.Timetrigger, error) {
return nil, err return nil, err
} }
triggers := make([]tpr.Timetrigger, 0) triggers := make([]crd.TimeTrigger, 0)
err = json.Unmarshal(body, &triggers) err = json.Unmarshal(body, &triggers)
if err != nil { if err != nil {
return nil, err return nil, err
+5 -5
View File
@@ -19,21 +19,21 @@ package controller
import ( import (
"log" "log"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func Start(port int) { func Start(port int) {
fc, kc, err := tpr.MakeFissionClient() fc, _, apiExtClient, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Fatalf("Failed to connect to K8s API: %v", err) log.Fatalf("Failed to connect to K8s API: %v", err)
} }
err = tpr.EnsureFissionTPRs(kc) err = crd.EnsureFissionCRDs(apiExtClient)
if err != nil { if err != nil {
log.Fatalf("Failed to create fission TPRs: %v", err) log.Fatalf("Failed to create fission CRDs: %v", err)
} }
fc.WaitForTPRs() fc.WaitForCRDs()
api, err := MakeAPI() api, err := MakeAPI()
if err != nil { if err != nil {
+3 -3
View File
@@ -20,11 +20,11 @@ import (
"errors" "errors"
"regexp" "regexp"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func makeTPRBackedAPI() (*API, error) { func makeCRDBackedAPI() (*API, error) {
fissionClient, kubernetesClient, err := tpr.MakeFissionClient() fissionClient, kubernetesClient, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
return nil, err return nil, err
} }
+3 -3
View File
@@ -26,7 +26,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) EnvironmentApiList(w http.ResponseWriter, r *http.Request) { func (a *API) EnvironmentApiList(w http.ResponseWriter, r *http.Request) {
@@ -52,7 +52,7 @@ func (a *API) EnvironmentApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
var env tpr.Environment var env crd.Environment
err = json.Unmarshal(body, &env) err = json.Unmarshal(body, &env)
if err != nil { if err != nil {
log.Printf("Failed to unmarshal request body: [%v]", body) log.Printf("Failed to unmarshal request body: [%v]", body)
@@ -115,7 +115,7 @@ func (a *API) EnvironmentApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
var env tpr.Environment var env crd.Environment
err = json.Unmarshal(body, &env) err = json.Unmarshal(body, &env)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
+3 -3
View File
@@ -34,7 +34,7 @@ import (
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) FunctionApiList(w http.ResponseWriter, r *http.Request) { func (a *API) FunctionApiList(w http.ResponseWriter, r *http.Request) {
@@ -60,7 +60,7 @@ func (a *API) FunctionApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
var f tpr.Function var f crd.Function
err = json.Unmarshal(body, &f) err = json.Unmarshal(body, &f)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -121,7 +121,7 @@ func (a *API) FunctionApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
var f tpr.Function var f crd.Function
err = json.Unmarshal(body, &f) err = json.Unmarshal(body, &f)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
+12 -12
View File
@@ -26,11 +26,11 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) HTTPTriggerApiList(w http.ResponseWriter, r *http.Request) { func (a *API) HTTPTriggerApiList(w http.ResponseWriter, r *http.Request) {
triggers, err := a.fissionClient.Httptriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) triggers, err := a.fissionClient.HTTPTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -45,8 +45,8 @@ func (a *API) HTTPTriggerApiList(w http.ResponseWriter, r *http.Request) {
a.respondWithSuccess(w, resp) a.respondWithSuccess(w, resp)
} }
func (a *API) checkHttpTriggerDuplicates(t *tpr.Httptrigger) error { func (a *API) checkHTTPTriggerDuplicates(t *crd.HTTPTrigger) error {
triggers, err := a.fissionClient.Httptriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) triggers, err := a.fissionClient.HTTPTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -67,7 +67,7 @@ func (a *API) HTTPTriggerApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
var t tpr.Httptrigger var t crd.HTTPTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -81,13 +81,13 @@ func (a *API) HTTPTriggerApiCreate(w http.ResponseWriter, r *http.Request) {
} }
// Ensure we don't have a duplicate HTTP route defined (same URL and method) // Ensure we don't have a duplicate HTTP route defined (same URL and method)
err = a.checkHttpTriggerDuplicates(&t) err = a.checkHTTPTriggerDuplicates(&t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
} }
tnew, err := a.fissionClient.Httptriggers(t.Metadata.Namespace).Create(&t) tnew, err := a.fissionClient.HTTPTriggers(t.Metadata.Namespace).Create(&t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -111,7 +111,7 @@ func (a *API) HTTPTriggerApiGet(w http.ResponseWriter, r *http.Request) {
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
t, err := a.fissionClient.Httptriggers(ns).Get(name) t, err := a.fissionClient.HTTPTriggers(ns).Get(name)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -136,7 +136,7 @@ func (a *API) HTTPTriggerApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
var t tpr.Httptrigger var t crd.HTTPTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -149,13 +149,13 @@ func (a *API) HTTPTriggerApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
err = a.checkHttpTriggerDuplicates(&t) err = a.checkHTTPTriggerDuplicates(&t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
} }
tnew, err := a.fissionClient.Httptriggers(t.Metadata.Namespace).Update(&t) tnew, err := a.fissionClient.HTTPTriggers(t.Metadata.Namespace).Update(&t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -177,7 +177,7 @@ func (a *API) HTTPTriggerApiDelete(w http.ResponseWriter, r *http.Request) {
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
err := a.fissionClient.Httptriggers(ns).Delete(name, &metav1.DeleteOptions{}) err := a.fissionClient.HTTPTriggers(ns).Delete(name, &metav1.DeleteOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
+8 -8
View File
@@ -25,12 +25,12 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) MessageQueueTriggerApiList(w http.ResponseWriter, r *http.Request) { func (a *API) MessageQueueTriggerApiList(w http.ResponseWriter, r *http.Request) {
//mqType := r.FormValue("mqtype") // ignored for now //mqType := r.FormValue("mqtype") // ignored for now
triggers, err := a.fissionClient.Messagequeuetriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) triggers, err := a.fissionClient.MessageQueueTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -50,7 +50,7 @@ func (a *API) MessageQueueTriggerApiCreate(w http.ResponseWriter, r *http.Reques
return return
} }
var mqTrigger tpr.Messagequeuetrigger var mqTrigger crd.MessageQueueTrigger
err = json.Unmarshal(body, &mqTrigger) err = json.Unmarshal(body, &mqTrigger)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -63,7 +63,7 @@ func (a *API) MessageQueueTriggerApiCreate(w http.ResponseWriter, r *http.Reques
return return
} }
tnew, err := a.fissionClient.Messagequeuetriggers(mqTrigger.Metadata.Namespace).Create(&mqTrigger) tnew, err := a.fissionClient.MessageQueueTriggers(mqTrigger.Metadata.Namespace).Create(&mqTrigger)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -86,7 +86,7 @@ func (a *API) MessageQueueTriggerApiGet(w http.ResponseWriter, r *http.Request)
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
mqTrigger, err := a.fissionClient.Messagequeuetriggers(ns).Get(name) mqTrigger, err := a.fissionClient.MessageQueueTriggers(ns).Get(name)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -109,7 +109,7 @@ func (a *API) MessageQueueTriggerApiUpdate(w http.ResponseWriter, r *http.Reques
return return
} }
var mqTrigger tpr.Messagequeuetrigger var mqTrigger crd.MessageQueueTrigger
err = json.Unmarshal(body, &mqTrigger) err = json.Unmarshal(body, &mqTrigger)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -122,7 +122,7 @@ func (a *API) MessageQueueTriggerApiUpdate(w http.ResponseWriter, r *http.Reques
return return
} }
tnew, err := a.fissionClient.Messagequeuetriggers(mqTrigger.Metadata.Namespace).Update(&mqTrigger) tnew, err := a.fissionClient.MessageQueueTriggers(mqTrigger.Metadata.Namespace).Update(&mqTrigger)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -144,7 +144,7 @@ func (a *API) MessageQueueTriggerApiDelete(w http.ResponseWriter, r *http.Reques
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
err := a.fissionClient.Messagequeuetriggers(ns).Delete(name, &metav1.DeleteOptions{}) err := a.fissionClient.MessageQueueTriggers(ns).Delete(name, &metav1.DeleteOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
+3 -3
View File
@@ -25,7 +25,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) PackageApiList(w http.ResponseWriter, r *http.Request) { func (a *API) PackageApiList(w http.ResponseWriter, r *http.Request) {
@@ -51,7 +51,7 @@ func (a *API) PackageApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
var f tpr.Package var f crd.Package
err = json.Unmarshal(body, &f) err = json.Unmarshal(body, &f)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -130,7 +130,7 @@ func (a *API) PackageApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
var f tpr.Package var f crd.Package
err = json.Unmarshal(body, &f) err = json.Unmarshal(body, &f)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
+8 -8
View File
@@ -26,11 +26,11 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) TimeTriggerApiList(w http.ResponseWriter, r *http.Request) { func (a *API) TimeTriggerApiList(w http.ResponseWriter, r *http.Request) {
triggers, err := a.fissionClient.Timetriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) triggers, err := a.fissionClient.TimeTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -52,7 +52,7 @@ func (a *API) TimeTriggerApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
var t tpr.Timetrigger var t crd.TimeTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -73,7 +73,7 @@ func (a *API) TimeTriggerApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
tnew, err := a.fissionClient.Timetriggers(t.Metadata.Namespace).Create(&t) tnew, err := a.fissionClient.TimeTriggers(t.Metadata.Namespace).Create(&t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -97,7 +97,7 @@ func (a *API) TimeTriggerApiGet(w http.ResponseWriter, r *http.Request) {
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
t, err := a.fissionClient.Timetriggers(ns).Get(name) t, err := a.fissionClient.TimeTriggers(ns).Get(name)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -122,7 +122,7 @@ func (a *API) TimeTriggerApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
var t tpr.Timetrigger var t crd.TimeTrigger
err = json.Unmarshal(body, &t) err = json.Unmarshal(body, &t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -142,7 +142,7 @@ func (a *API) TimeTriggerApiUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
tnew, err := a.fissionClient.Timetriggers(t.Metadata.Namespace).Update(&t) tnew, err := a.fissionClient.TimeTriggers(t.Metadata.Namespace).Update(&t)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -164,7 +164,7 @@ func (a *API) TimeTriggerApiDelete(w http.ResponseWriter, r *http.Request) {
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
err := a.fissionClient.Timetriggers(ns).Delete(name, &metav1.DeleteOptions{}) err := a.fissionClient.TimeTriggers(ns).Delete(name, &metav1.DeleteOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
+64
View File
@@ -0,0 +1,64 @@
/*
Copyright 2017 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 controller
import (
"net/http"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/crd"
)
func (a *API) Tpr2crdApi(w http.ResponseWriter, r *http.Request) {
_, kubeClient, _, err := crd.MakeFissionClient()
if err != nil {
a.respondWithError(w, err)
return
}
fissionTprs := []string{
"function.fission.io",
"environment.fission.io",
"httptrigger.fission.io",
"kuberneteswatchtrigger.fission.io",
"timetrigger.fission.io",
"messagequeuetrigger.fission.io",
"package.fission.io",
}
tprList, err := kubeClient.ThirdPartyResources().List(metav1.ListOptions{})
if err != nil {
a.respondWithError(w, err)
return
}
for _, tpr := range tprList.Items {
for _, tprName := range fissionTprs {
if tpr.Name == tprName {
err := kubeClient.ThirdPartyResources().Delete(tpr.Name, &metav1.DeleteOptions{})
if err != nil {
a.respondWithError(w, err)
return
}
break
}
}
}
a.respondWithSuccess(w, nil)
}
+6 -6
View File
@@ -25,11 +25,11 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func (a *API) WatchApiList(w http.ResponseWriter, r *http.Request) { func (a *API) WatchApiList(w http.ResponseWriter, r *http.Request) {
watches, err := a.fissionClient.Kuberneteswatchtriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) watches, err := a.fissionClient.KubernetesWatchTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -51,7 +51,7 @@ func (a *API) WatchApiCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
var watch tpr.Kuberneteswatchtrigger var watch crd.KubernetesWatchTrigger
err = json.Unmarshal(body, &watch) err = json.Unmarshal(body, &watch)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
@@ -66,7 +66,7 @@ func (a *API) WatchApiCreate(w http.ResponseWriter, r *http.Request) {
// TODO check for duplicate watches // TODO check for duplicate watches
wnew, err := a.fissionClient.Kuberneteswatchtriggers(watch.Metadata.Namespace).Create(&watch) wnew, err := a.fissionClient.KubernetesWatchTriggers(watch.Metadata.Namespace).Create(&watch)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -90,7 +90,7 @@ func (a *API) WatchApiGet(w http.ResponseWriter, r *http.Request) {
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
watch, err := a.fissionClient.Kuberneteswatchtriggers(ns).Get(name) watch, err := a.fissionClient.KubernetesWatchTriggers(ns).Get(name)
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
@@ -118,7 +118,7 @@ func (a *API) WatchApiDelete(w http.ResponseWriter, r *http.Request) {
ns = metav1.NamespaceDefault ns = metav1.NamespaceDefault
} }
err := a.fissionClient.Kuberneteswatchtriggers(ns).Delete(name, &metav1.DeleteOptions{}) err := a.fissionClient.KubernetesWatchTriggers(ns).Delete(name, &metav1.DeleteOptions{})
if err != nil { if err != nil {
a.respondWithError(w, err) a.respondWithError(w, err)
return return
+52 -46
View File
@@ -14,13 +14,14 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
"errors" "errors"
"os" "os"
"time" "time"
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
@@ -34,14 +35,14 @@ import (
type ( type (
FissionClient struct { FissionClient struct {
tprClient *rest.RESTClient crdClient *rest.RESTClient
} }
) )
// Get a kubernetes client using the kubeconfig file at the // Get a kubernetes client using the kubeconfig file at the
// environment var $KUBECONFIG, or an in-cluster config if that's // environment var $KUBECONFIG, or an in-cluster config if that's
// undefined. // undefined.
func GetKubernetesClient() (*rest.Config, *kubernetes.Clientset, error) { func GetKubernetesClient() (*rest.Config, *kubernetes.Clientset, *apiextensionsclient.Clientset, error) {
var config *rest.Config var config *rest.Config
var err error var err error
@@ -51,26 +52,31 @@ func GetKubernetesClient() (*rest.Config, *kubernetes.Clientset, error) {
if len(kubeConfig) != 0 { if len(kubeConfig) != 0 {
config, err = clientcmd.BuildConfigFromFlags("", kubeConfig) config, err = clientcmd.BuildConfigFromFlags("", kubeConfig)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, nil, err
} }
} else { } else {
config, err = rest.InClusterConfig() config, err = rest.InClusterConfig()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, nil, err
} }
} }
// creates the clientset // creates the clientset
clientset, err := kubernetes.NewForConfig(config) clientset, err := kubernetes.NewForConfig(config)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, nil, err
} }
return config, clientset, nil apiExtClientset, err := apiextensionsclient.NewForConfig(config)
if err != nil {
return nil, nil, nil, err
}
return config, clientset, apiExtClientset, nil
} }
// GetTprClient gets a TPR client config // GetCrdClient gets a CRD client config
func GetTprClient(config *rest.Config) (*rest.RESTClient, error) { func GetCrdClient(config *rest.Config) (*rest.RESTClient, error) {
// mutate config to add our types // mutate config to add our types
configureClient(config) configureClient(config)
@@ -78,14 +84,14 @@ func GetTprClient(config *rest.Config) (*rest.RESTClient, error) {
return rest.RESTClientFor(config) return rest.RESTClientFor(config)
} }
// configureClient sets up a REST client for Fission TPR types. // configureClient sets up a REST client for Fission CRD types.
// //
// This is copied from the client-go TPR example. (I don't understand // This is copied from the client-go CRD example. (I don't understand
// all of it completely.) It registers our types with the global API // all of it completely.) It registers our types with the global API
// "scheme" (api.Scheme), which keeps a directory of types [I guess so // "scheme" (api.Scheme), which keeps a directory of types [I guess so
// it can use the string in the Kind field to make a Go object?]. It // it can use the string in the Kind field to make a Go object?]. It
// also puts the fission TPR types under a "group version" which we // also puts the fission CRD types under a "group version" which we
// create for our TPRs types. // create for our CRDs types.
func configureClient(config *rest.Config) { func configureClient(config *rest.Config) {
groupversion := schema.GroupVersion{ groupversion := schema.GroupVersion{
Group: "fission.io", Group: "fission.io",
@@ -114,29 +120,29 @@ func configureClient(config *rest.Config) {
) )
scheme.AddKnownTypes( scheme.AddKnownTypes(
groupversion, groupversion,
&Httptrigger{}, &HTTPTrigger{},
&HttptriggerList{}, &HTTPTriggerList{},
&metav1.ListOptions{}, &metav1.ListOptions{},
&metav1.DeleteOptions{}, &metav1.DeleteOptions{},
) )
scheme.AddKnownTypes( scheme.AddKnownTypes(
groupversion, groupversion,
&Kuberneteswatchtrigger{}, &KubernetesWatchTrigger{},
&KuberneteswatchtriggerList{}, &KubernetesWatchTriggerList{},
&metav1.ListOptions{}, &metav1.ListOptions{},
&metav1.DeleteOptions{}, &metav1.DeleteOptions{},
) )
scheme.AddKnownTypes( scheme.AddKnownTypes(
groupversion, groupversion,
&Timetrigger{}, &TimeTrigger{},
&TimetriggerList{}, &TimeTriggerList{},
&metav1.ListOptions{}, &metav1.ListOptions{},
&metav1.DeleteOptions{}, &metav1.DeleteOptions{},
) )
scheme.AddKnownTypes( scheme.AddKnownTypes(
groupversion, groupversion,
&Messagequeuetrigger{}, &MessageQueueTrigger{},
&MessagequeuetriggerList{}, &MessageQueueTriggerList{},
&metav1.ListOptions{}, &metav1.ListOptions{},
&metav1.DeleteOptions{}, &metav1.DeleteOptions{},
) )
@@ -152,10 +158,10 @@ func configureClient(config *rest.Config) {
schemeBuilder.AddToScheme(scheme.Scheme) schemeBuilder.AddToScheme(scheme.Scheme)
} }
func waitForTPRs(tprClient *rest.RESTClient) error { func waitForCRDs(crdClient *rest.RESTClient) error {
start := time.Now() start := time.Now()
for { for {
fi := MakeFunctionInterface(tprClient, metav1.NamespaceDefault) fi := MakeFunctionInterface(crdClient, metav1.NamespaceDefault)
_, err := fi.List(metav1.ListOptions{}) _, err := fi.List(metav1.ListOptions{})
if err != nil { if err != nil {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
@@ -164,51 +170,51 @@ func waitForTPRs(tprClient *rest.RESTClient) error {
} }
if time.Now().Sub(start) > 30*time.Second { if time.Now().Sub(start) > 30*time.Second {
return errors.New("timeout waiting for TPRs") return errors.New("timeout waiting for CRDs")
} }
} }
} }
func MakeFissionClient() (*FissionClient, *kubernetes.Clientset, error) { func MakeFissionClient() (*FissionClient, *kubernetes.Clientset, *apiextensionsclient.Clientset, error) {
config, kubeClient, err := GetKubernetesClient() config, kubeClient, apiExtClient, err := GetKubernetesClient()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, nil, err
} }
tprClient, err := GetTprClient(config) crdClient, err := GetCrdClient(config)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, nil, err
} }
fc := &FissionClient{ fc := &FissionClient{
tprClient: tprClient, crdClient: crdClient,
} }
return fc, kubeClient, nil return fc, kubeClient, apiExtClient, nil
} }
func (fc *FissionClient) Functions(ns string) FunctionInterface { func (fc *FissionClient) Functions(ns string) FunctionInterface {
return MakeFunctionInterface(fc.tprClient, ns) return MakeFunctionInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) Environments(ns string) EnvironmentInterface { func (fc *FissionClient) Environments(ns string) EnvironmentInterface {
return MakeEnvironmentInterface(fc.tprClient, ns) return MakeEnvironmentInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) Httptriggers(ns string) HttptriggerInterface { func (fc *FissionClient) HTTPTriggers(ns string) HTTPTriggerInterface {
return MakeHttptriggerInterface(fc.tprClient, ns) return MakeHTTPTriggerInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) Kuberneteswatchtriggers(ns string) KuberneteswatchtriggerInterface { func (fc *FissionClient) KubernetesWatchTriggers(ns string) KubernetesWatchTriggerInterface {
return MakeKuberneteswatchtriggerInterface(fc.tprClient, ns) return MakeKubernetesWatchTriggerInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) Timetriggers(ns string) TimetriggerInterface { func (fc *FissionClient) TimeTriggers(ns string) TimeTriggerInterface {
return MakeTimetriggerInterface(fc.tprClient, ns) return MakeTimeTriggerInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) Messagequeuetriggers(ns string) MessagequeuetriggerInterface { func (fc *FissionClient) MessageQueueTriggers(ns string) MessageQueueTriggerInterface {
return MakeMessagequeuetriggerInterface(fc.tprClient, ns) return MakeMessageQueueTriggerInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) Packages(ns string) PackageInterface { func (fc *FissionClient) Packages(ns string) PackageInterface {
return MakePackageInterface(fc.tprClient, ns) return MakePackageInterface(fc.crdClient, ns)
} }
func (fc *FissionClient) WaitForTPRs() { func (fc *FissionClient) WaitForCRDs() {
waitForTPRs(fc.tprClient) waitForCRDs(fc.crdClient)
} }
func (fc *FissionClient) GetTprClient() *rest.RESTClient { func (fc *FissionClient) GetCrdClient() *rest.RESTClient {
return fc.tprClient return fc.crdClient
} }
+170
View File
@@ -0,0 +1,170 @@
/*
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 crd
import (
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
crdGroupName = "fission.io"
crdVersion = "v1"
)
// ensureCRD checks if the given CRD type exists, and creates it if
// needed. (Note that this creates the CRD type; it doesn't create any
// _instances_ of that type.)
func ensureCRD(clientset *apiextensionsclient.Clientset, crd *apiextensionsv1beta1.CustomResourceDefinition) error {
_, err := clientset.Apiextensions().CustomResourceDefinitions().Get(crd.ObjectMeta.Name, metav1.GetOptions{})
if err != nil {
if errors.IsNotFound(err) {
_, err := clientset.Apiextensions().CustomResourceDefinitions().Create(crd)
if err != nil {
return err
}
}
}
return nil
}
// Ensure CRDs
func EnsureFissionCRDs(clientset *apiextensionsclient.Clientset) error {
crds := []apiextensionsv1beta1.CustomResourceDefinition{
// Functions
{
ObjectMeta: metav1.ObjectMeta{
Name: "functions.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "Function",
Plural: "functions",
Singular: "function",
},
},
},
// Environments (function containers)
{
ObjectMeta: metav1.ObjectMeta{
Name: "environments.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "Environment",
Plural: "environments",
Singular: "environment",
},
},
},
// HTTP triggers for functions
{
ObjectMeta: metav1.ObjectMeta{
Name: "httptriggers.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "HTTPTrigger",
Plural: "httptriggers",
Singular: "httptrigger",
},
},
},
// Kubernetes watch triggers for functions
{
ObjectMeta: metav1.ObjectMeta{
Name: "kuberneteswatchtriggers.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "KubernetesWatchTrigger",
Plural: "kuberneteswatchtriggers",
Singular: "kuberneteswatchtrigger",
},
},
},
// Time-based triggers for functions
{
ObjectMeta: metav1.ObjectMeta{
Name: "timetriggers.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "TimeTrigger",
Plural: "timetriggers",
Singular: "timetrigger",
},
},
},
// Message queue triggers for functions
{
ObjectMeta: metav1.ObjectMeta{
Name: "messagequeuetriggers.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "MessageQueueTrigger",
Plural: "messagequeuetriggers",
Singular: "messagequeuetrigger",
},
},
},
// Packages: archives containing source or binaries for one or more functions
{
ObjectMeta: metav1.ObjectMeta{
Name: "packages.fission.io",
},
Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{
Group: crdGroupName,
Version: crdVersion,
Scope: apiextensionsv1beta1.NamespaceScoped,
Names: apiextensionsv1beta1.CustomResourceDefinitionNames{
Kind: "Package",
Plural: "packages",
Singular: "package",
},
},
},
}
for _, crd := range crds {
err := ensureCRD(clientset, &crd)
if err != nil {
return err
}
}
return nil
}
+51 -39
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
"log" "log"
@@ -34,7 +34,7 @@ func panicIf(err error) {
} }
} }
func functionTests(tprClient *rest.RESTClient) { func functionTests(crdClient *rest.RESTClient) {
// sample function object // sample function object
function := &Function{ function := &Function{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@@ -42,7 +42,8 @@ func functionTests(tprClient *rest.RESTClient) {
APIVersion: "fission.io/v1", APIVersion: "fission.io/v1",
}, },
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault,
}, },
Spec: fission.FunctionSpec{ Spec: fission.FunctionSpec{
Package: fission.FunctionPackageRef{ Package: fission.FunctionPackageRef{
@@ -59,7 +60,7 @@ func functionTests(tprClient *rest.RESTClient) {
} }
// Test function CRUD // Test function CRUD
fi := MakeFunctionInterface(tprClient, metav1.NamespaceDefault) fi := MakeFunctionInterface(crdClient, metav1.NamespaceDefault)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
fi.Delete(function.Metadata.Name, nil) fi.Delete(function.Metadata.Name, nil)
@@ -81,6 +82,7 @@ func functionTests(tprClient *rest.RESTClient) {
log.Printf("f.Metadata = %#v", f.Metadata) log.Printf("f.Metadata = %#v", f.Metadata)
// update // update
function.Metadata.ResourceVersion = f.Metadata.ResourceVersion
function.Spec.Environment.Name = "yyy" function.Spec.Environment.Name = "yyy"
f, err = fi.Update(function) f, err = fi.Update(function)
panicIf(err) panicIf(err)
@@ -91,9 +93,9 @@ func functionTests(tprClient *rest.RESTClient) {
fl, err := fi.List(metav1.ListOptions{}) fl, err := fi.List(metav1.ListOptions{})
panicIf(err) panicIf(err)
if len(fl.Items) != 1 { if len(fl.Items) != 1 {
log.Panicf("wrong count from list: %v", fl) log.Panicf("wrong count from function list: %v", len(fl.Items))
} }
if fl.Items[0].Spec.Environment.Name != function.Spec.Environment.Name { if fl.Items[0].Spec.Environment.Name != f.Spec.Environment.Name {
log.Panicf("bad object from list: %v", fl.Items[0]) log.Panicf("bad object from list: %v", fl.Items[0])
} }
@@ -106,6 +108,7 @@ func functionTests(tprClient *rest.RESTClient) {
panicIf(err) panicIf(err)
start := time.Now() start := time.Now()
function.Metadata.ResourceVersion = ""
f, err = fi.Create(function) f, err = fi.Create(function)
panicIf(err) panicIf(err)
defer fi.Delete(f.Metadata.Name, nil) defer fi.Delete(f.Metadata.Name, nil)
@@ -131,7 +134,7 @@ func functionTests(tprClient *rest.RESTClient) {
} }
func environmentTests(tprClient *rest.RESTClient) { func environmentTests(crdClient *rest.RESTClient) {
// sample environment object // sample environment object
environment := &Environment{ environment := &Environment{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
@@ -139,7 +142,8 @@ func environmentTests(tprClient *rest.RESTClient) {
APIVersion: "fission.io/v1", APIVersion: "fission.io/v1",
}, },
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault,
}, },
Spec: fission.EnvironmentSpec{ Spec: fission.EnvironmentSpec{
Runtime: fission.Runtime{ Runtime: fission.Runtime{
@@ -153,7 +157,7 @@ func environmentTests(tprClient *rest.RESTClient) {
} }
// Test environment CRUD // Test environment CRUD
ei := MakeEnvironmentInterface(tprClient, metav1.NamespaceDefault) ei := MakeEnvironmentInterface(crdClient, metav1.NamespaceDefault)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
ei.Delete(environment.Metadata.Name, nil) ei.Delete(environment.Metadata.Name, nil)
@@ -173,6 +177,7 @@ func environmentTests(tprClient *rest.RESTClient) {
} }
// update // update
environment.Metadata.ResourceVersion = e.Metadata.ResourceVersion
environment.Spec.Runtime.Image = "www" environment.Spec.Runtime.Image = "www"
e, err = ei.Update(environment) e, err = ei.Update(environment)
panicIf(err) panicIf(err)
@@ -181,9 +186,9 @@ func environmentTests(tprClient *rest.RESTClient) {
el, err := ei.List(metav1.ListOptions{}) el, err := ei.List(metav1.ListOptions{})
panicIf(err) panicIf(err)
if len(el.Items) != 1 { if len(el.Items) != 1 {
log.Panicf("wrong count from list: %v", len(el.Items)) log.Panicf("wrong count from environment list: %v", len(el.Items))
} }
if el.Items[0].Spec.Runtime.Image != environment.Spec.Runtime.Image { if el.Items[0].Spec.Runtime.Image != e.Spec.Runtime.Image {
log.Panicf("bad object from list: %v", el.Items[0]) log.Panicf("bad object from list: %v", el.Items[0])
} }
@@ -196,6 +201,7 @@ func environmentTests(tprClient *rest.RESTClient) {
panicIf(err) panicIf(err)
start := time.Now() start := time.Now()
environment.Metadata.ResourceVersion = ""
e, err = ei.Create(environment) e, err = ei.Create(environment)
panicIf(err) panicIf(err)
defer ei.Delete(e.Metadata.Name, nil) defer ei.Delete(e.Metadata.Name, nil)
@@ -221,15 +227,16 @@ func environmentTests(tprClient *rest.RESTClient) {
} }
func httpTriggerTests(tprClient *rest.RESTClient) { func httpTriggerTests(crdClient *rest.RESTClient) {
// sample httpTrigger object // sample httpTrigger object
httpTrigger := &Httptrigger{ httpTrigger := &HTTPTrigger{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
Kind: "Httptrigger", Kind: "HTTPTrigger",
APIVersion: "fission.io/v1", APIVersion: "fission.io/v1",
}, },
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault,
}, },
Spec: fission.HTTPTriggerSpec{ Spec: fission.HTTPTriggerSpec{
RelativeURL: "/hi", RelativeURL: "/hi",
@@ -242,7 +249,7 @@ func httpTriggerTests(tprClient *rest.RESTClient) {
} }
// Test httpTrigger CRUD // Test httpTrigger CRUD
ei := MakeHttptriggerInterface(tprClient, metav1.NamespaceDefault) ei := MakeHTTPTriggerInterface(crdClient, metav1.NamespaceDefault)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
ei.Delete(httpTrigger.Metadata.Name, nil) ei.Delete(httpTrigger.Metadata.Name, nil)
@@ -262,6 +269,7 @@ func httpTriggerTests(tprClient *rest.RESTClient) {
} }
// update // update
httpTrigger.Metadata.ResourceVersion = e.Metadata.ResourceVersion
httpTrigger.Spec.Method = "POST" httpTrigger.Spec.Method = "POST"
e, err = ei.Update(httpTrigger) e, err = ei.Update(httpTrigger)
panicIf(err) panicIf(err)
@@ -270,9 +278,9 @@ func httpTriggerTests(tprClient *rest.RESTClient) {
el, err := ei.List(metav1.ListOptions{}) el, err := ei.List(metav1.ListOptions{})
panicIf(err) panicIf(err)
if len(el.Items) != 1 { if len(el.Items) != 1 {
log.Panicf("wrong count from list: %v", el) log.Panicf("wrong count from http trigger list: %v", len(el.Items))
} }
if el.Items[0].Spec.Method != httpTrigger.Spec.Method { if el.Items[0].Spec.Method != e.Spec.Method {
log.Panicf("bad object from list: %v", el.Items[0]) log.Panicf("bad object from list: %v", el.Items[0])
} }
@@ -285,6 +293,7 @@ func httpTriggerTests(tprClient *rest.RESTClient) {
panicIf(err) panicIf(err)
start := time.Now() start := time.Now()
httpTrigger.Metadata.ResourceVersion = ""
e, err = ei.Create(httpTrigger) e, err = ei.Create(httpTrigger)
panicIf(err) panicIf(err)
defer ei.Delete(e.Metadata.Name, nil) defer ei.Delete(e.Metadata.Name, nil)
@@ -297,9 +306,9 @@ func httpTriggerTests(tprClient *rest.RESTClient) {
log.Panicf("Didn't get watch event") log.Panicf("Didn't get watch event")
} }
case ev := <-wi.ResultChan(): case ev := <-wi.ResultChan():
obj, ok := ev.Object.(*Httptrigger) obj, ok := ev.Object.(*HTTPTrigger)
if !ok { if !ok {
log.Panicf("Can't cast to Httptrigger") log.Panicf("Can't cast to HTTPTrigger")
} }
if obj.Spec.Method != httpTrigger.Spec.Method { if obj.Spec.Method != httpTrigger.Spec.Method {
log.Panicf("Bad object from watch: %#v", obj) log.Panicf("Bad object from watch: %#v", obj)
@@ -310,15 +319,16 @@ func httpTriggerTests(tprClient *rest.RESTClient) {
} }
func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) { func kubernetesWatchTriggerTests(crdClient *rest.RESTClient) {
// sample kubernetesWatchTrigger object // sample kubernetesWatchTrigger object
kubernetesWatchTrigger := &Kuberneteswatchtrigger{ kubernetesWatchTrigger := &KubernetesWatchTrigger{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
Kind: "Kuberneteswatchtrigger", Kind: "KubernetesWatchTrigger",
APIVersion: "fission.io/v1", APIVersion: "fission.io/v1",
}, },
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: metav1.NamespaceDefault,
}, },
Spec: fission.KubernetesWatchTriggerSpec{ Spec: fission.KubernetesWatchTriggerSpec{
Namespace: "foo", Namespace: "foo",
@@ -334,7 +344,7 @@ func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) {
} }
// Test kubernetesWatchTrigger CRUD // Test kubernetesWatchTrigger CRUD
ei := MakeKuberneteswatchtriggerInterface(tprClient, metav1.NamespaceDefault) ei := MakeKubernetesWatchTriggerInterface(crdClient, metav1.NamespaceDefault)
// cleanup from old crashed tests, ignore errors // cleanup from old crashed tests, ignore errors
ei.Delete(kubernetesWatchTrigger.Metadata.Name, nil) ei.Delete(kubernetesWatchTrigger.Metadata.Name, nil)
@@ -354,6 +364,7 @@ func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) {
} }
// update // update
kubernetesWatchTrigger.Metadata.ResourceVersion = e.Metadata.ResourceVersion
kubernetesWatchTrigger.Spec.Type = "service" kubernetesWatchTrigger.Spec.Type = "service"
e, err = ei.Update(kubernetesWatchTrigger) e, err = ei.Update(kubernetesWatchTrigger)
panicIf(err) panicIf(err)
@@ -362,9 +373,9 @@ func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) {
el, err := ei.List(metav1.ListOptions{}) el, err := ei.List(metav1.ListOptions{})
panicIf(err) panicIf(err)
if len(el.Items) != 1 { if len(el.Items) != 1 {
log.Panicf("wrong count from list: %v", el) log.Panicf("wrong count from kubeWatcher list: %v", len(el.Items))
} }
if el.Items[0].Spec.Type != kubernetesWatchTrigger.Spec.Type { if el.Items[0].Spec.Type != e.Spec.Type {
log.Panicf("bad object from list: %v", el.Items[0]) log.Panicf("bad object from list: %v", el.Items[0])
} }
@@ -377,6 +388,7 @@ func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) {
panicIf(err) panicIf(err)
start := time.Now() start := time.Now()
kubernetesWatchTrigger.Metadata.ResourceVersion = ""
e, err = ei.Create(kubernetesWatchTrigger) e, err = ei.Create(kubernetesWatchTrigger)
panicIf(err) panicIf(err)
defer ei.Delete(e.Metadata.Name, nil) defer ei.Delete(e.Metadata.Name, nil)
@@ -389,9 +401,9 @@ func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) {
log.Panicf("Didn't get watch event") log.Panicf("Didn't get watch event")
} }
case ev := <-wi.ResultChan(): case ev := <-wi.ResultChan():
obj, ok := ev.Object.(*Kuberneteswatchtrigger) obj, ok := ev.Object.(*KubernetesWatchTrigger)
if !ok { if !ok {
log.Panicf("Can't cast to Kuberneteswatchtrigger") log.Panicf("Can't cast to KubernetesWatchTrigger")
} }
if obj.Spec.Type != kubernetesWatchTrigger.Spec.Type { if obj.Spec.Type != kubernetesWatchTrigger.Spec.Type {
log.Panicf("Bad object from watch: %#v", obj) log.Panicf("Bad object from watch: %#v", obj)
@@ -402,7 +414,7 @@ func kubernetesWatchTriggerTests(tprClient *rest.RESTClient) {
} }
func TestTpr(t *testing.T) { func TestCrd(t *testing.T) {
// skip test if no cluster available for testing // skip test if no cluster available for testing
kubeconfig := os.Getenv("KUBECONFIG") kubeconfig := os.Getenv("KUBECONFIG")
if len(kubeconfig) == 0 { if len(kubeconfig) == 0 {
@@ -412,22 +424,22 @@ func TestTpr(t *testing.T) {
// Create the client config. Needs the KUBECONFIG env var to // Create the client config. Needs the KUBECONFIG env var to
// point at a valid kubeconfig. // point at a valid kubeconfig.
config, clientset, err := GetKubernetesClient() config, _, apiExtClient, err := GetKubernetesClient()
panicIf(err) panicIf(err)
// init our types // init our types
err = EnsureFissionTPRs(clientset) err = EnsureFissionCRDs(apiExtClient)
panicIf(err) panicIf(err)
// rest client with knowledge about our tpr types // rest client with knowledge about our crd types
tprClient, err := GetTprClient(config) crdClient, err := GetCrdClient(config)
panicIf(err) panicIf(err)
err = waitForTPRs(tprClient) err = waitForCRDs(crdClient)
panicIf(err) panicIf(err)
functionTests(tprClient) functionTests(crdClient)
environmentTests(tprClient) environmentTests(crdClient)
httpTriggerTests(tprClient) httpTriggerTests(crdClient)
kubernetesWatchTriggerTests(tprClient) kubernetesWatchTriggerTests(crdClient)
} }
+3 -3
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -39,9 +39,9 @@ type (
} }
) )
func MakeEnvironmentInterface(tprClient *rest.RESTClient, namespace string) EnvironmentInterface { func MakeEnvironmentInterface(crdClient *rest.RESTClient, namespace string) EnvironmentInterface {
return &environmentClient{ return &environmentClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
+3 -3
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -39,9 +39,9 @@ type (
} }
) )
func MakeFunctionInterface(tprClient *rest.RESTClient, namespace string) FunctionInterface { func MakeFunctionInterface(crdClient *rest.RESTClient, namespace string) FunctionInterface {
return &functionClient{ return &functionClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
+16 -16
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -24,12 +24,12 @@ import (
) )
type ( type (
HttptriggerInterface interface { HTTPTriggerInterface interface {
Create(*Httptrigger) (*Httptrigger, error) Create(*HTTPTrigger) (*HTTPTrigger, error)
Get(name string) (*Httptrigger, error) Get(name string) (*HTTPTrigger, error)
Update(*Httptrigger) (*Httptrigger, error) Update(*HTTPTrigger) (*HTTPTrigger, error)
Delete(name string, options *metav1.DeleteOptions) error Delete(name string, options *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (*HttptriggerList, error) List(opts metav1.ListOptions) (*HTTPTriggerList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error) Watch(opts metav1.ListOptions) (watch.Interface, error)
} }
@@ -39,15 +39,15 @@ type (
} }
) )
func MakeHttptriggerInterface(tprClient *rest.RESTClient, namespace string) HttptriggerInterface { func MakeHTTPTriggerInterface(crdClient *rest.RESTClient, namespace string) HTTPTriggerInterface {
return &httpTriggerClient{ return &httpTriggerClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
func (c *httpTriggerClient) Create(obj *Httptrigger) (*Httptrigger, error) { func (c *httpTriggerClient) Create(obj *HTTPTrigger) (*HTTPTrigger, error) {
var result Httptrigger var result HTTPTrigger
err := c.client.Post(). err := c.client.Post().
Resource("httptriggers"). Resource("httptriggers").
Namespace(c.namespace). Namespace(c.namespace).
@@ -59,8 +59,8 @@ func (c *httpTriggerClient) Create(obj *Httptrigger) (*Httptrigger, error) {
return &result, nil return &result, nil
} }
func (c *httpTriggerClient) Get(name string) (*Httptrigger, error) { func (c *httpTriggerClient) Get(name string) (*HTTPTrigger, error) {
var result Httptrigger var result HTTPTrigger
err := c.client.Get(). err := c.client.Get().
Resource("httptriggers"). Resource("httptriggers").
Namespace(c.namespace). Namespace(c.namespace).
@@ -72,8 +72,8 @@ func (c *httpTriggerClient) Get(name string) (*Httptrigger, error) {
return &result, nil return &result, nil
} }
func (c *httpTriggerClient) Update(obj *Httptrigger) (*Httptrigger, error) { func (c *httpTriggerClient) Update(obj *HTTPTrigger) (*HTTPTrigger, error) {
var result Httptrigger var result HTTPTrigger
err := c.client.Put(). err := c.client.Put().
Resource("httptriggers"). Resource("httptriggers").
Namespace(c.namespace). Namespace(c.namespace).
@@ -96,8 +96,8 @@ func (c *httpTriggerClient) Delete(name string, opts *metav1.DeleteOptions) erro
Error() Error()
} }
func (c *httpTriggerClient) List(opts metav1.ListOptions) (*HttptriggerList, error) { func (c *httpTriggerClient) List(opts metav1.ListOptions) (*HTTPTriggerList, error) {
var result HttptriggerList var result HTTPTriggerList
err := c.client.Get(). err := c.client.Get().
Namespace(c.namespace). Namespace(c.namespace).
Resource("httptriggers"). Resource("httptriggers").
+1 -1
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
"fmt" "fmt"
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -24,12 +24,12 @@ import (
) )
type ( type (
KuberneteswatchtriggerInterface interface { KubernetesWatchTriggerInterface interface {
Create(*Kuberneteswatchtrigger) (*Kuberneteswatchtrigger, error) Create(*KubernetesWatchTrigger) (*KubernetesWatchTrigger, error)
Get(name string) (*Kuberneteswatchtrigger, error) Get(name string) (*KubernetesWatchTrigger, error)
Update(*Kuberneteswatchtrigger) (*Kuberneteswatchtrigger, error) Update(*KubernetesWatchTrigger) (*KubernetesWatchTrigger, error)
Delete(name string, options *metav1.DeleteOptions) error Delete(name string, options *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (*KuberneteswatchtriggerList, error) List(opts metav1.ListOptions) (*KubernetesWatchTriggerList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error) Watch(opts metav1.ListOptions) (watch.Interface, error)
} }
@@ -39,15 +39,15 @@ type (
} }
) )
func MakeKuberneteswatchtriggerInterface(tprClient *rest.RESTClient, namespace string) KuberneteswatchtriggerInterface { func MakeKubernetesWatchTriggerInterface(crdClient *rest.RESTClient, namespace string) KubernetesWatchTriggerInterface {
return &kubernetesWatchTriggerClient{ return &kubernetesWatchTriggerClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
func (c *kubernetesWatchTriggerClient) Create(obj *Kuberneteswatchtrigger) (*Kuberneteswatchtrigger, error) { func (c *kubernetesWatchTriggerClient) Create(obj *KubernetesWatchTrigger) (*KubernetesWatchTrigger, error) {
var result Kuberneteswatchtrigger var result KubernetesWatchTrigger
err := c.client.Post(). err := c.client.Post().
Resource("kuberneteswatchtriggers"). Resource("kuberneteswatchtriggers").
Namespace(c.namespace). Namespace(c.namespace).
@@ -59,8 +59,8 @@ func (c *kubernetesWatchTriggerClient) Create(obj *Kuberneteswatchtrigger) (*Kub
return &result, nil return &result, nil
} }
func (c *kubernetesWatchTriggerClient) Get(name string) (*Kuberneteswatchtrigger, error) { func (c *kubernetesWatchTriggerClient) Get(name string) (*KubernetesWatchTrigger, error) {
var result Kuberneteswatchtrigger var result KubernetesWatchTrigger
err := c.client.Get(). err := c.client.Get().
Resource("kuberneteswatchtriggers"). Resource("kuberneteswatchtriggers").
Namespace(c.namespace). Namespace(c.namespace).
@@ -72,8 +72,8 @@ func (c *kubernetesWatchTriggerClient) Get(name string) (*Kuberneteswatchtrigger
return &result, nil return &result, nil
} }
func (c *kubernetesWatchTriggerClient) Update(obj *Kuberneteswatchtrigger) (*Kuberneteswatchtrigger, error) { func (c *kubernetesWatchTriggerClient) Update(obj *KubernetesWatchTrigger) (*KubernetesWatchTrigger, error) {
var result Kuberneteswatchtrigger var result KubernetesWatchTrigger
err := c.client.Put(). err := c.client.Put().
Resource("kuberneteswatchtriggers"). Resource("kuberneteswatchtriggers").
Namespace(c.namespace). Namespace(c.namespace).
@@ -96,8 +96,8 @@ func (c *kubernetesWatchTriggerClient) Delete(name string, opts *metav1.DeleteOp
Error() Error()
} }
func (c *kubernetesWatchTriggerClient) List(opts metav1.ListOptions) (*KuberneteswatchtriggerList, error) { func (c *kubernetesWatchTriggerClient) List(opts metav1.ListOptions) (*KubernetesWatchTriggerList, error) {
var result KuberneteswatchtriggerList var result KubernetesWatchTriggerList
err := c.client.Get(). err := c.client.Get().
Namespace(c.namespace). Namespace(c.namespace).
Resource("kuberneteswatchtriggers"). Resource("kuberneteswatchtriggers").
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -24,30 +24,30 @@ import (
) )
type ( type (
MessagequeuetriggerInterface interface { MessageQueueTriggerInterface interface {
Create(*Messagequeuetrigger) (*Messagequeuetrigger, error) Create(*MessageQueueTrigger) (*MessageQueueTrigger, error)
Get(name string) (*Messagequeuetrigger, error) Get(name string) (*MessageQueueTrigger, error)
Update(*Messagequeuetrigger) (*Messagequeuetrigger, error) Update(*MessageQueueTrigger) (*MessageQueueTrigger, error)
Delete(name string, options *metav1.DeleteOptions) error Delete(name string, options *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (*MessagequeuetriggerList, error) List(opts metav1.ListOptions) (*MessageQueueTriggerList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error) Watch(opts metav1.ListOptions) (watch.Interface, error)
} }
messagequeuetriggerClient struct { messageQueueTriggerClient struct {
client *rest.RESTClient client *rest.RESTClient
namespace string namespace string
} }
) )
func MakeMessagequeuetriggerInterface(tprClient *rest.RESTClient, namespace string) MessagequeuetriggerInterface { func MakeMessageQueueTriggerInterface(crdClient *rest.RESTClient, namespace string) MessageQueueTriggerInterface {
return &messagequeuetriggerClient{ return &messageQueueTriggerClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
func (fc *messagequeuetriggerClient) Create(f *Messagequeuetrigger) (*Messagequeuetrigger, error) { func (fc *messageQueueTriggerClient) Create(f *MessageQueueTrigger) (*MessageQueueTrigger, error) {
var result Messagequeuetrigger var result MessageQueueTrigger
err := fc.client.Post(). err := fc.client.Post().
Resource("messagequeuetriggers"). Resource("messagequeuetriggers").
Namespace(fc.namespace). Namespace(fc.namespace).
@@ -59,8 +59,8 @@ func (fc *messagequeuetriggerClient) Create(f *Messagequeuetrigger) (*Messageque
return &result, nil return &result, nil
} }
func (fc *messagequeuetriggerClient) Get(name string) (*Messagequeuetrigger, error) { func (fc *messageQueueTriggerClient) Get(name string) (*MessageQueueTrigger, error) {
var result Messagequeuetrigger var result MessageQueueTrigger
err := fc.client.Get(). err := fc.client.Get().
Resource("messagequeuetriggers"). Resource("messagequeuetriggers").
Namespace(fc.namespace). Namespace(fc.namespace).
@@ -72,8 +72,8 @@ func (fc *messagequeuetriggerClient) Get(name string) (*Messagequeuetrigger, err
return &result, nil return &result, nil
} }
func (fc *messagequeuetriggerClient) Update(f *Messagequeuetrigger) (*Messagequeuetrigger, error) { func (fc *messageQueueTriggerClient) Update(f *MessageQueueTrigger) (*MessageQueueTrigger, error) {
var result Messagequeuetrigger var result MessageQueueTrigger
err := fc.client.Put(). err := fc.client.Put().
Resource("messagequeuetriggers"). Resource("messagequeuetriggers").
Namespace(fc.namespace). Namespace(fc.namespace).
@@ -86,7 +86,7 @@ func (fc *messagequeuetriggerClient) Update(f *Messagequeuetrigger) (*Messageque
return &result, nil return &result, nil
} }
func (fc *messagequeuetriggerClient) Delete(name string, opts *metav1.DeleteOptions) error { func (fc *messageQueueTriggerClient) Delete(name string, opts *metav1.DeleteOptions) error {
return fc.client.Delete(). return fc.client.Delete().
Namespace(fc.namespace). Namespace(fc.namespace).
Resource("messagequeuetriggers"). Resource("messagequeuetriggers").
@@ -96,8 +96,8 @@ func (fc *messagequeuetriggerClient) Delete(name string, opts *metav1.DeleteOpti
Error() Error()
} }
func (fc *messagequeuetriggerClient) List(opts metav1.ListOptions) (*MessagequeuetriggerList, error) { func (fc *messageQueueTriggerClient) List(opts metav1.ListOptions) (*MessageQueueTriggerList, error) {
var result MessagequeuetriggerList var result MessageQueueTriggerList
err := fc.client.Get(). err := fc.client.Get().
Namespace(fc.namespace). Namespace(fc.namespace).
Resource("messagequeuetriggers"). Resource("messagequeuetriggers").
@@ -110,7 +110,7 @@ func (fc *messagequeuetriggerClient) List(opts metav1.ListOptions) (*Messagequeu
return &result, nil return &result, nil
} }
func (fc *messagequeuetriggerClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { func (fc *messageQueueTriggerClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return fc.client.Get(). return fc.client.Get().
Prefix("watch"). Prefix("watch").
Namespace(fc.namespace). Namespace(fc.namespace).
+3 -3
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -39,9 +39,9 @@ type (
} }
) )
func MakePackageInterface(tprClient *rest.RESTClient, namespace string) PackageInterface { func MakePackageInterface(crdClient *rest.RESTClient, namespace string) PackageInterface {
return &packageClient{ return &packageClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
+20 -20
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -24,30 +24,30 @@ import (
) )
type ( type (
TimetriggerInterface interface { TimeTriggerInterface interface {
Create(*Timetrigger) (*Timetrigger, error) Create(*TimeTrigger) (*TimeTrigger, error)
Get(name string) (*Timetrigger, error) Get(name string) (*TimeTrigger, error)
Update(*Timetrigger) (*Timetrigger, error) Update(*TimeTrigger) (*TimeTrigger, error)
Delete(name string, options *metav1.DeleteOptions) error Delete(name string, options *metav1.DeleteOptions) error
List(opts metav1.ListOptions) (*TimetriggerList, error) List(opts metav1.ListOptions) (*TimeTriggerList, error)
Watch(opts metav1.ListOptions) (watch.Interface, error) Watch(opts metav1.ListOptions) (watch.Interface, error)
} }
timetriggerClient struct { timeTriggerClient struct {
client *rest.RESTClient client *rest.RESTClient
namespace string namespace string
} }
) )
func MakeTimetriggerInterface(tprClient *rest.RESTClient, namespace string) TimetriggerInterface { func MakeTimeTriggerInterface(crdClient *rest.RESTClient, namespace string) TimeTriggerInterface {
return &timetriggerClient{ return &timeTriggerClient{
client: tprClient, client: crdClient,
namespace: namespace, namespace: namespace,
} }
} }
func (fc *timetriggerClient) Create(f *Timetrigger) (*Timetrigger, error) { func (fc *timeTriggerClient) Create(f *TimeTrigger) (*TimeTrigger, error) {
var result Timetrigger var result TimeTrigger
err := fc.client.Post(). err := fc.client.Post().
Resource("timetriggers"). Resource("timetriggers").
Namespace(fc.namespace). Namespace(fc.namespace).
@@ -59,8 +59,8 @@ func (fc *timetriggerClient) Create(f *Timetrigger) (*Timetrigger, error) {
return &result, nil return &result, nil
} }
func (fc *timetriggerClient) Get(name string) (*Timetrigger, error) { func (fc *timeTriggerClient) Get(name string) (*TimeTrigger, error) {
var result Timetrigger var result TimeTrigger
err := fc.client.Get(). err := fc.client.Get().
Resource("timetriggers"). Resource("timetriggers").
Namespace(fc.namespace). Namespace(fc.namespace).
@@ -72,8 +72,8 @@ func (fc *timetriggerClient) Get(name string) (*Timetrigger, error) {
return &result, nil return &result, nil
} }
func (fc *timetriggerClient) Update(f *Timetrigger) (*Timetrigger, error) { func (fc *timeTriggerClient) Update(f *TimeTrigger) (*TimeTrigger, error) {
var result Timetrigger var result TimeTrigger
err := fc.client.Put(). err := fc.client.Put().
Resource("timetriggers"). Resource("timetriggers").
Namespace(fc.namespace). Namespace(fc.namespace).
@@ -86,7 +86,7 @@ func (fc *timetriggerClient) Update(f *Timetrigger) (*Timetrigger, error) {
return &result, nil return &result, nil
} }
func (fc *timetriggerClient) Delete(name string, opts *metav1.DeleteOptions) error { func (fc *timeTriggerClient) Delete(name string, opts *metav1.DeleteOptions) error {
return fc.client.Delete(). return fc.client.Delete().
Namespace(fc.namespace). Namespace(fc.namespace).
Resource("timetriggers"). Resource("timetriggers").
@@ -96,8 +96,8 @@ func (fc *timetriggerClient) Delete(name string, opts *metav1.DeleteOptions) err
Error() Error()
} }
func (fc *timetriggerClient) List(opts metav1.ListOptions) (*TimetriggerList, error) { func (fc *timeTriggerClient) List(opts metav1.ListOptions) (*TimeTriggerList, error) {
var result TimetriggerList var result TimeTriggerList
err := fc.client.Get(). err := fc.client.Get().
Namespace(fc.namespace). Namespace(fc.namespace).
Resource("timetriggers"). Resource("timetriggers").
@@ -110,7 +110,7 @@ func (fc *timetriggerClient) List(opts metav1.ListOptions) (*TimetriggerList, er
return &result, nil return &result, nil
} }
func (fc *timetriggerClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { func (fc *timeTriggerClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return fc.client.Get(). return fc.client.Get().
Prefix("watch"). Prefix("watch").
Namespace(fc.namespace). Namespace(fc.namespace).
+35 -38
View File
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package tpr package crd
import ( import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -24,14 +24,14 @@ import (
) )
// //
// To add a Fission TPR type: // To add a Fission CRD type:
// 1. Create a "spec" type, for everything in the type except metadata // 1. Create a "spec" type, for everything in the type except metadata
// 2. Create the type with metadata + the spec // 2. Create the type with metadata + the spec
// 3. Create a list type (for example see FunctionList and Function, below) // 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 // 4. Add methods at the bottom of this file for satisfying Object and List interfaces
// 5. Add the type to configureClient in client.go // 5. Add the type to configureClient in client.go
// 6. Add the type to EnsureFissionTPRs in tpr.go // 6. Add the type to EnsureFissionCRDs in crd.go
// 7. Add tests to tpr_test.go // 7. Add tests to crd_test.go
// 8. Add a CRUD Interface type (analogous to FunctionInterface in function.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 // 9. Add a getter method for your interface type to FissionClient in client.go
// //
@@ -78,68 +78,65 @@ type (
Items []Environment `json:"items"` Items []Environment `json:"items"`
} }
// HTTP Triggers. (Something in the TPR reflection stuff wants HTTPTrigger struct {
// it to be spelled "Httptrigger" not "HTTPTrigger" or even
// "HttpTrigger". Bleh.)
Httptrigger struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ObjectMeta `json:"metadata"` Metadata metav1.ObjectMeta `json:"metadata"`
Spec fission.HTTPTriggerSpec `json:"spec"` Spec fission.HTTPTriggerSpec `json:"spec"`
} }
HttptriggerList struct { HTTPTriggerList struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ListMeta `json:"metadata"` Metadata metav1.ListMeta `json:"metadata"`
Items []Httptrigger `json:"items"` Items []HTTPTrigger `json:"items"`
} }
// Kubernetes Watches as triggers // Kubernetes Watches as triggers
Kuberneteswatchtrigger struct { KubernetesWatchTrigger struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ObjectMeta `json:"metadata"` Metadata metav1.ObjectMeta `json:"metadata"`
Spec fission.KubernetesWatchTriggerSpec `json:"spec"` Spec fission.KubernetesWatchTriggerSpec `json:"spec"`
} }
KuberneteswatchtriggerList struct { KubernetesWatchTriggerList struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ListMeta `json:"metadata"` Metadata metav1.ListMeta `json:"metadata"`
Items []Kuberneteswatchtrigger `json:"items"` Items []KubernetesWatchTrigger `json:"items"`
} }
// Time triggers // Time triggers
Timetrigger struct { TimeTrigger struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ObjectMeta `json:"metadata"` Metadata metav1.ObjectMeta `json:"metadata"`
Spec fission.TimeTriggerSpec `json:"spec"` Spec fission.TimeTriggerSpec `json:"spec"`
} }
TimetriggerList struct { TimeTriggerList struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ListMeta `json:"metadata"` Metadata metav1.ListMeta `json:"metadata"`
Items []Timetrigger `json:"items"` Items []TimeTrigger `json:"items"`
} }
// Message Queue triggers // Message Queue triggers
Messagequeuetrigger struct { MessageQueueTrigger struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ObjectMeta `json:"metadata"` Metadata metav1.ObjectMeta `json:"metadata"`
Spec fission.MessageQueueTriggerSpec `json:"spec"` Spec fission.MessageQueueTriggerSpec `json:"spec"`
} }
MessagequeuetriggerList struct { MessageQueueTriggerList struct {
metav1.TypeMeta `json:",inline"` metav1.TypeMeta `json:",inline"`
Metadata metav1.ListMeta `json:"metadata"` Metadata metav1.ListMeta `json:"metadata"`
Items []Messagequeuetrigger `json:"items"` Items []MessageQueueTrigger `json:"items"`
} }
) )
// Each TPR type needs: // Each CRD type needs:
// GetObjectKind (to satisfy the Object interface) // GetObjectKind (to satisfy the Object interface)
// //
// In addition, each singular TPR type needs: // In addition, each singular CRD type needs:
// GetObjectMeta (to satisfy the ObjectMetaAccessor interface) // GetObjectMeta (to satisfy the ObjectMetaAccessor interface)
// //
// And each list TPR type needs: // And each list CRD type needs:
// GetListMeta (to satisfy the ListMetaAccessor interface) // GetListMeta (to satisfy the ListMetaAccessor interface)
func (f *Function) GetObjectKind() schema.ObjectKind { func (f *Function) GetObjectKind() schema.ObjectKind {
@@ -148,16 +145,16 @@ func (f *Function) GetObjectKind() schema.ObjectKind {
func (e *Environment) GetObjectKind() schema.ObjectKind { func (e *Environment) GetObjectKind() schema.ObjectKind {
return &e.TypeMeta return &e.TypeMeta
} }
func (ht *Httptrigger) GetObjectKind() schema.ObjectKind { func (ht *HTTPTrigger) GetObjectKind() schema.ObjectKind {
return &ht.TypeMeta return &ht.TypeMeta
} }
func (w *Kuberneteswatchtrigger) GetObjectKind() schema.ObjectKind { func (w *KubernetesWatchTrigger) GetObjectKind() schema.ObjectKind {
return &w.TypeMeta return &w.TypeMeta
} }
func (w *Timetrigger) GetObjectKind() schema.ObjectKind { func (w *TimeTrigger) GetObjectKind() schema.ObjectKind {
return &w.TypeMeta return &w.TypeMeta
} }
func (w *Messagequeuetrigger) GetObjectKind() schema.ObjectKind { func (w *MessageQueueTrigger) GetObjectKind() schema.ObjectKind {
return &w.TypeMeta return &w.TypeMeta
} }
func (w *Package) GetObjectKind() schema.ObjectKind { func (w *Package) GetObjectKind() schema.ObjectKind {
@@ -170,16 +167,16 @@ func (f *Function) GetObjectMeta() metav1.Object {
func (e *Environment) GetObjectMeta() metav1.Object { func (e *Environment) GetObjectMeta() metav1.Object {
return &e.Metadata return &e.Metadata
} }
func (ht *Httptrigger) GetObjectMeta() metav1.Object { func (ht *HTTPTrigger) GetObjectMeta() metav1.Object {
return &ht.Metadata return &ht.Metadata
} }
func (w *Kuberneteswatchtrigger) GetObjectMeta() metav1.Object { func (w *KubernetesWatchTrigger) GetObjectMeta() metav1.Object {
return &w.Metadata return &w.Metadata
} }
func (w *Timetrigger) GetObjectMeta() metav1.Object { func (w *TimeTrigger) GetObjectMeta() metav1.Object {
return &w.Metadata return &w.Metadata
} }
func (w *Messagequeuetrigger) GetObjectMeta() metav1.Object { func (w *MessageQueueTrigger) GetObjectMeta() metav1.Object {
return &w.Metadata return &w.Metadata
} }
func (w *Package) GetObjectMeta() metav1.Object { func (w *Package) GetObjectMeta() metav1.Object {
@@ -192,16 +189,16 @@ func (fl *FunctionList) GetObjectKind() schema.ObjectKind {
func (el *EnvironmentList) GetObjectKind() schema.ObjectKind { func (el *EnvironmentList) GetObjectKind() schema.ObjectKind {
return &el.TypeMeta return &el.TypeMeta
} }
func (hl *HttptriggerList) GetObjectKind() schema.ObjectKind { func (hl *HTTPTriggerList) GetObjectKind() schema.ObjectKind {
return &hl.TypeMeta return &hl.TypeMeta
} }
func (wl *KuberneteswatchtriggerList) GetObjectKind() schema.ObjectKind { func (wl *KubernetesWatchTriggerList) GetObjectKind() schema.ObjectKind {
return &wl.TypeMeta return &wl.TypeMeta
} }
func (wl *TimetriggerList) GetObjectKind() schema.ObjectKind { func (wl *TimeTriggerList) GetObjectKind() schema.ObjectKind {
return &wl.TypeMeta return &wl.TypeMeta
} }
func (wl *MessagequeuetriggerList) GetObjectKind() schema.ObjectKind { func (wl *MessageQueueTriggerList) GetObjectKind() schema.ObjectKind {
return &wl.TypeMeta return &wl.TypeMeta
} }
func (wl *PackageList) GetObjectKind() schema.ObjectKind { func (wl *PackageList) GetObjectKind() schema.ObjectKind {
@@ -214,16 +211,16 @@ func (fl *FunctionList) GetListMeta() metav1.List {
func (el *EnvironmentList) GetListMeta() metav1.List { func (el *EnvironmentList) GetListMeta() metav1.List {
return &el.Metadata return &el.Metadata
} }
func (hl *HttptriggerList) GetListMeta() metav1.List { func (hl *HTTPTriggerList) GetListMeta() metav1.List {
return &hl.Metadata return &hl.Metadata
} }
func (wl *KuberneteswatchtriggerList) GetListMeta() metav1.List { func (wl *KubernetesWatchTriggerList) GetListMeta() metav1.List {
return &wl.Metadata return &wl.Metadata
} }
func (wl *TimetriggerList) GetListMeta() metav1.List { func (wl *TimeTriggerList) GetListMeta() metav1.List {
return &wl.Metadata return &wl.Metadata
} }
func (wl *MessagequeuetriggerList) GetListMeta() metav1.List { func (wl *MessageQueueTriggerList) GetListMeta() metav1.List {
return &wl.Metadata return &wl.Metadata
} }
func (wl *PackageList) GetListMeta() metav1.List { func (wl *PackageList) GetListMeta() metav1.List {
+3 -6
View File
@@ -17,11 +17,10 @@ import (
"github.com/mholt/archiver" "github.com/mholt/archiver"
"github.com/satori/go.uuid" "github.com/satori/go.uuid"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
storageSvcClient "github.com/fission/fission/storagesvc/client" storageSvcClient "github.com/fission/fission/storagesvc/client"
"github.com/fission/fission/tpr"
) )
type ( type (
@@ -51,8 +50,7 @@ type (
Fetcher struct { Fetcher struct {
sharedVolumePath string sharedVolumePath string
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
kubeClient *kubernetes.Clientset
} }
) )
@@ -63,14 +61,13 @@ const (
) )
func MakeFetcher(sharedVolumePath string) *Fetcher { func MakeFetcher(sharedVolumePath string) *Fetcher {
fissionClient, kubeClient, err := tpr.MakeFissionClient() fissionClient, _, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
return nil return nil
} }
return &Fetcher{ return &Fetcher{
sharedVolumePath: sharedVolumePath, sharedVolumePath: sharedVolumePath,
fissionClient: fissionClient, fissionClient: fissionClient,
kubeClient: kubeClient,
} }
} }
+2 -2
View File
@@ -25,7 +25,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func envCreate(c *cli.Context) error { func envCreate(c *cli.Context) error {
@@ -59,7 +59,7 @@ func envCreate(c *cli.Context) error {
envVersion = 1 envVersion = 1
} }
env := &tpr.Environment{ env := &crd.Environment{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: envName, Name: envName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
+4 -4
View File
@@ -37,9 +37,9 @@ import (
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/controller/client" "github.com/fission/fission/controller/client"
"github.com/fission/fission/crd"
"github.com/fission/fission/fission/logdb" "github.com/fission/fission/fission/logdb"
storageSvcClient "github.com/fission/fission/storagesvc/client" storageSvcClient "github.com/fission/fission/storagesvc/client"
"github.com/fission/fission/tpr"
) )
func fileSize(filePath string) int64 { func fileSize(filePath string) int64 {
@@ -113,7 +113,7 @@ func createPackage(client *client.Client, envName, srcArchiveName, deployArchive
} }
pkgName := strings.ToLower(uuid.NewV4().String()) pkgName := strings.ToLower(uuid.NewV4().String())
pkg := &tpr.Package{ pkg := &crd.Package{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: pkgName, Name: pkgName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -200,7 +200,7 @@ func fnCreate(c *cli.Context) error {
pkgMetadata := createPackage(client, envName, srcArchiveName, deployArchiveName, buildcmd) pkgMetadata := createPackage(client, envName, srcArchiveName, deployArchiveName, buildcmd)
function := &tpr.Function{ function := &crd.Function{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: fnName, Name: fnName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -236,7 +236,7 @@ func fnCreate(c *cli.Context) error {
method = "GET" method = "GET"
} }
triggerName := uuid.NewV4().String() triggerName := uuid.NewV4().String()
ht := &tpr.Httptrigger{ ht := &crd.HTTPTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: triggerName, Name: triggerName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
+2 -2
View File
@@ -28,7 +28,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
// returns one of http.Method* // returns one of http.Method*
@@ -76,7 +76,7 @@ func htCreate(c *cli.Context) error {
// just name triggers by uuid. // just name triggers by uuid.
triggerName := uuid.NewV4().String() triggerName := uuid.NewV4().String()
ht := &tpr.Httptrigger{ ht := &crd.HTTPTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: triggerName, Name: triggerName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
+9
View File
@@ -135,6 +135,14 @@ func main() {
{Name: "dump", Usage: "Dump all state from a v0.1 fission installation", Flags: []cli.Flag{upgradeFileFlag}, Action: upgradeDumpState}, {Name: "dump", Usage: "Dump all state from a v0.1 fission installation", Flags: []cli.Flag{upgradeFileFlag}, Action: upgradeDumpState},
{Name: "restore", Usage: "Restore state dumped from a v0.1 install into a v0.2+ install", Flags: []cli.Flag{upgradeFileFlag}, Action: upgradeRestoreState}, {Name: "restore", Usage: "Restore state dumped from a v0.1 install into a v0.2+ install", Flags: []cli.Flag{upgradeFileFlag}, Action: upgradeRestoreState},
} }
migrateFileFlag := cli.StringFlag{Name: "file", Usage: "JSON file containing all CRDs"}
migrateSubCommands := []cli.Command{
{Name: "dump", Usage: "Dump all state from a pre-0.4 Fission installation (which used ThirdPartyResources) into a JSON file", Flags: []cli.Flag{migrateFileFlag}, Action: migrateDumpTPR},
{Name: "delete", Usage: "Delete all TPRs", Flags: []cli.Flag{}, Action: migrateDeleteTPR},
{Name: "restore", Usage: "Restore state dumped from a pre-0.4 Fission cluster. Requires Fission 0.4, which uses Kubernetes CustomResources.", Flags: []cli.Flag{migrateFileFlag}, Action: migrateRestoreCRD},
}
app.Commands = []cli.Command{ app.Commands = []cli.Command{
{Name: "function", Aliases: []string{"fn"}, Usage: "Create, update and manage functions", Subcommands: fnSubcommands}, {Name: "function", Aliases: []string{"fn"}, Usage: "Create, update and manage functions", Subcommands: fnSubcommands},
{Name: "httptrigger", Aliases: []string{"ht", "route"}, Usage: "Manage HTTP triggers (routes) for functions", Subcommands: htSubcommands}, {Name: "httptrigger", Aliases: []string{"ht", "route"}, Usage: "Manage HTTP triggers (routes) for functions", Subcommands: htSubcommands},
@@ -143,6 +151,7 @@ func main() {
{Name: "environment", Aliases: []string{"env"}, Usage: "Manage environments", Subcommands: envSubcommands}, {Name: "environment", Aliases: []string{"env"}, Usage: "Manage environments", Subcommands: envSubcommands},
{Name: "watch", Aliases: []string{"w"}, Usage: "Manage watches", Subcommands: wSubCommands}, {Name: "watch", Aliases: []string{"w"}, Usage: "Manage watches", Subcommands: wSubCommands},
{Name: "upgrade", Aliases: []string{}, Usage: "Upgrade tool from fission v0.1", Subcommands: upgradeSubCommands}, {Name: "upgrade", Aliases: []string{}, Usage: "Upgrade tool from fission v0.1", Subcommands: upgradeSubCommands},
{Name: "tpr2crd", Aliases: []string{}, Usage: "Migrate tool for TPR to CRD", Subcommands: migrateSubCommands},
} }
app.Run(os.Args) app.Run(os.Args)
+213
View File
@@ -0,0 +1,213 @@
/*
Copyright 2017 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 main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"github.com/urfave/cli"
"github.com/fission/fission"
"github.com/fission/fission/controller/client"
"github.com/fission/fission/crd"
"github.com/fission/fission/mqtrigger/messageQueue"
)
type (
TPRResource struct {
Packages []crd.Package `json:"packages"`
Functions []crd.Function `json:"functions"`
Environments []crd.Environment `json:"environments"`
HTTPTriggers []crd.HTTPTrigger `json:"httptriggers"`
Mqtriggers []crd.MessageQueueTrigger `json:"mqtriggers"`
TimeTriggers []crd.TimeTrigger `json:"timetriggers"`
Watches []crd.KubernetesWatchTrigger `json:"watches"`
}
)
func migrateDumpTPRResource(client *client.Client, filename string) {
pkgs, err := client.PackageList()
checkErr(err, "dump packages")
fns, err := client.FunctionList()
checkErr(err, "dump functions")
httpTriggers, err := client.HTTPTriggerList()
checkErr(err, "dump http triggers")
envs, err := client.EnvironmentList()
checkErr(err, "dump environments")
watches, err := client.WatchList()
checkErr(err, "dump watches")
timeTriggers, err := client.TimeTriggerList()
checkErr(err, "dump time triggers")
mqTriggers, err := client.MessageQueueTriggerList(messageQueue.NATS)
checkErr(err, "dump message queue triggers")
tprResource := TPRResource{
Packages: pkgs,
Functions: fns,
HTTPTriggers: httpTriggers,
Environments: envs,
Watches: watches,
TimeTriggers: timeTriggers,
Mqtriggers: mqTriggers,
}
// serialize tprResource
out, err := json.MarshalIndent(tprResource, "", " ")
checkErr(err, "serialize tpr state")
// dump to file fission-tpr.json
if len(filename) == 0 {
filename = "fission-tpr.json"
}
err = ioutil.WriteFile(filename, out, 0644)
checkErr(err, "write file")
fmt.Printf("Done: Saved %v packages, %v functions, %v HTTP triggers, %v watches, %v message queue triggers, %v time triggers.\n",
len(tprResource.Packages), len(tprResource.Functions), len(tprResource.HTTPTriggers), len(tprResource.Watches), len(tprResource.Mqtriggers),
len(tprResource.TimeTriggers))
}
func migrateDumpTPR(c *cli.Context) error {
filename := c.String("file")
client := getClient(c.GlobalString("server"))
migrateDumpTPRResource(client, filename)
return nil
}
func migrateDeleteTPR(c *cli.Context) error {
server := c.GlobalString("server")
relativeUrl := fmt.Sprintf("%v/%v", server, "v2/deleteTpr")
req, err := http.NewRequest("DELETE", relativeUrl, nil)
checkErr(err, "connect to fission server")
resp, err := http.DefaultClient.Do(req)
checkErr(err, "delete tpr resources")
defer resp.Body.Close()
if resp.StatusCode == 404 {
msg := fmt.Sprintf("Server %v isn't support deleteTpr method. Use --server to point at a 0.4.0+ Fission server.", server)
fatal(msg)
}
return nil
}
// checkAlreadyExistsError helps to check whether the error is AlreadyExists error or not.
func checkAlreadyExistsError(err error, msg string) {
fe, ok := err.(fission.Error)
// ignore AlreadyExists error, since a resource may exist.
if !ok || fe.Code != fission.ErrorNameExists {
checkErr(err, msg)
}
}
func migrateRestoreCRD(c *cli.Context) error {
filename := c.String("file")
if len(filename) == 0 {
filename = "fission-tpr.json"
}
contents, err := ioutil.ReadFile(filename)
checkErr(err, fmt.Sprintf("open file %v", filename))
var tprResource TPRResource
err = json.Unmarshal(contents, &tprResource)
checkErr(err, "parse dumped tpr")
client := getClient(c.GlobalString("server"))
// Though Kubernetes will migrate TPRs to CRDs automatically when TPR definition is
// deleted if the same name CRD exists. We still need to make sure that there is no
// resource gets lost during the migration. Also, since we changed the capitalization
// of some CRDs to CamelCase (e.g. Httptrigger -> HTTPTrigger), we need to recreate
// those resources by ourselves.
// create envs
for _, e := range tprResource.Environments {
e.Metadata.ResourceVersion = ""
_, err = client.EnvironmentCreate(&crd.Environment{
Metadata: e.Metadata,
Spec: e.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create environment %v", e.Metadata.Name))
}
// create httptriggers
for _, t := range tprResource.HTTPTriggers {
t.Metadata.ResourceVersion = ""
_, err = client.HTTPTriggerCreate(&crd.HTTPTrigger{
Metadata: t.Metadata,
Spec: t.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create http trigger %v", t.Metadata.Name))
}
// create mqtriggers
for _, t := range tprResource.Mqtriggers {
t.Metadata.ResourceVersion = ""
_, err = client.MessageQueueTriggerCreate(&crd.MessageQueueTrigger{
Metadata: t.Metadata,
Spec: t.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create http trigger %v", t.Metadata.Name))
}
// create time triggers
for _, t := range tprResource.TimeTriggers {
t.Metadata.ResourceVersion = ""
_, err = client.TimeTriggerCreate(&crd.TimeTrigger{
Metadata: t.Metadata,
Spec: t.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create time trigger %v", t.Metadata.Name))
}
// create watches
for _, t := range tprResource.Watches {
t.Metadata.ResourceVersion = ""
_, err = client.WatchCreate(&crd.KubernetesWatchTrigger{
Metadata: t.Metadata,
Spec: t.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create kubernetes watch trigger %v", t.Metadata.Name))
}
// create packages
for _, p := range tprResource.Packages {
p.Metadata.ResourceVersion = ""
_, err = client.PackageCreate(&crd.Package{
Metadata: p.Metadata,
Spec: p.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create function %v", p.Metadata.Name))
}
// create functions
for _, f := range tprResource.Functions {
f.Metadata.ResourceVersion = ""
_, err = client.FunctionCreate(&crd.Function{
Metadata: f.Metadata,
Spec: f.Spec,
})
checkAlreadyExistsError(err, fmt.Sprintf("create function %v", f.Metadata.Name))
}
return nil
}
+2 -2
View File
@@ -26,8 +26,8 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
"github.com/fission/fission/mqtrigger/messageQueue" "github.com/fission/fission/mqtrigger/messageQueue"
"github.com/fission/fission/tpr"
) )
func mqtCreate(c *cli.Context) error { func mqtCreate(c *cli.Context) error {
@@ -72,7 +72,7 @@ func mqtCreate(c *cli.Context) error {
checkMQTopicAvailability(mqType, topic, respTopic) checkMQTopicAvailability(mqType, topic, respTopic)
mqt := tpr.Messagequeuetrigger{ mqt := crd.MessageQueueTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: mqtName, Name: mqtName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
+2 -2
View File
@@ -26,7 +26,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func ttCreate(c *cli.Context) error { func ttCreate(c *cli.Context) error {
@@ -45,7 +45,7 @@ func ttCreate(c *cli.Context) error {
fatal("Need a cron spec like '0 30 * * *', '@every 1h30m', or '@hourly'; use --cron") fatal("Need a cron spec like '0 30 * * *', '@every 1h30m', or '@hourly'; use --cron")
} }
tt := &tpr.Timetrigger{ tt := &crd.TimeTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: name, Name: name,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
+24 -24
View File
@@ -15,7 +15,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
"github.com/fission/fission/v1" "github.com/fission/fission/v1"
) )
@@ -23,9 +23,9 @@ type (
V1FissionState struct { V1FissionState struct {
Functions []v1.Function `json:"functions"` Functions []v1.Function `json:"functions"`
Environments []v1.Environment `json:"environments"` Environments []v1.Environment `json:"environments"`
Httptriggers []v1.HTTPTrigger `json:"httptriggers"` HTTPTriggers []v1.HTTPTrigger `json:"httptriggers"`
Mqtriggers []v1.MessageQueueTrigger `json:"mqtriggers"` Mqtriggers []v1.MessageQueueTrigger `json:"mqtriggers"`
Timetriggers []v1.TimeTrigger `json:"timetriggers"` TimeTriggers []v1.TimeTrigger `json:"timetriggers"`
Watches []v1.Watch `json:"watches"` Watches []v1.Watch `json:"watches"`
NameChanges map[string]string `json:"namechanges"` NameChanges map[string]string `json:"namechanges"`
} }
@@ -133,7 +133,7 @@ func upgradeDumpV1State(v1url string, filename string) {
fmt.Println("Getting routes") fmt.Println("Getting routes")
resp = get(v1url + "/triggers/http") resp = get(v1url + "/triggers/http")
err = json.Unmarshal(resp, &v1state.Httptriggers) err = json.Unmarshal(resp, &v1state.HTTPTriggers)
checkErr(err, "parse server response") checkErr(err, "parse server response")
fmt.Println("Getting message queue triggers") fmt.Println("Getting message queue triggers")
@@ -143,7 +143,7 @@ func upgradeDumpV1State(v1url string, filename string) {
fmt.Println("Getting time triggers") fmt.Println("Getting time triggers")
resp = get(v1url + "/triggers/time") resp = get(v1url + "/triggers/time")
err = json.Unmarshal(resp, &v1state.Timetriggers) err = json.Unmarshal(resp, &v1state.TimeTriggers)
checkErr(err, "parse server response") checkErr(err, "parse server response")
fmt.Println("Getting function list") fmt.Println("Getting function list")
@@ -163,7 +163,7 @@ func upgradeDumpV1State(v1url string, filename string) {
funcMetaSet[f.Metadata] = true funcMetaSet[f.Metadata] = true
nr.trackName(f.Metadata.Name) nr.trackName(f.Metadata.Name)
} }
for _, t := range v1state.Httptriggers { for _, t := range v1state.HTTPTriggers {
funcMetaSet[t.Function] = true funcMetaSet[t.Function] = true
nr.trackName(t.Metadata.Name) nr.trackName(t.Metadata.Name)
} }
@@ -175,7 +175,7 @@ func upgradeDumpV1State(v1url string, filename string) {
funcMetaSet[t.Function] = true funcMetaSet[t.Function] = true
nr.trackName(t.Metadata.Name) nr.trackName(t.Metadata.Name)
} }
for _, t := range v1state.Timetriggers { for _, t := range v1state.TimeTriggers {
funcMetaSet[t.Function] = true funcMetaSet[t.Function] = true
nr.trackName(t.Metadata.Name) nr.trackName(t.Metadata.Name)
} }
@@ -225,7 +225,7 @@ func upgradeDumpV1State(v1url string, filename string) {
checkErr(err, "write file") checkErr(err, "write file")
fmt.Printf("Done: Saved %v functions, %v HTTP triggers, %v watches, %v message queue triggers, %v time triggers.\n", fmt.Printf("Done: Saved %v functions, %v HTTP triggers, %v watches, %v message queue triggers, %v time triggers.\n",
len(v1state.Functions), len(v1state.Httptriggers), len(v1state.Watches), len(v1state.Mqtriggers), len(v1state.Timetriggers)) len(v1state.Functions), len(v1state.HTTPTriggers), len(v1state.Watches), len(v1state.Mqtriggers), len(v1state.TimeTriggers))
} }
func functionRefFromV1Metadata(m *v1.Metadata, nameRemap map[string]string) *fission.FunctionReference { func functionRefFromV1Metadata(m *v1.Metadata, nameRemap map[string]string) *fission.FunctionReference {
@@ -235,7 +235,7 @@ func functionRefFromV1Metadata(m *v1.Metadata, nameRemap map[string]string) *fis
} }
} }
func tprMetadataFromV1Metadata(m *v1.Metadata, nameRemap map[string]string) *metav1.ObjectMeta { func crdMetadataFromV1Metadata(m *v1.Metadata, nameRemap map[string]string) *metav1.ObjectMeta {
return &metav1.ObjectMeta{ return &metav1.ObjectMeta{
Name: nameRemap[m.Name], Name: nameRemap[m.Name],
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -302,7 +302,7 @@ func upgradeRestoreState(c *cli.Context) error {
}, },
Deployment: *archive, Deployment: *archive,
} }
pkg, err := client.PackageCreate(&tpr.Package{ pkg, err := client.PackageCreate(&crd.Package{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: pkgName, Name: pkgName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
@@ -310,8 +310,8 @@ func upgradeRestoreState(c *cli.Context) error {
Spec: pkgSpec, Spec: pkgSpec,
}) })
checkErr(err, fmt.Sprintf("create package %v", pkgName)) checkErr(err, fmt.Sprintf("create package %v", pkgName))
_, err = client.FunctionCreate(&tpr.Function{ _, err = client.FunctionCreate(&crd.Function{
Metadata: *tprMetadataFromV1Metadata(&f.Metadata, v1state.NameChanges), Metadata: *crdMetadataFromV1Metadata(&f.Metadata, v1state.NameChanges),
Spec: fission.FunctionSpec{ Spec: fission.FunctionSpec{
Environment: pkgSpec.Environment, Environment: pkgSpec.Environment,
Package: fission.FunctionPackageRef{ Package: fission.FunctionPackageRef{
@@ -329,8 +329,8 @@ func upgradeRestoreState(c *cli.Context) error {
// create envs // create envs
for _, e := range v1state.Environments { for _, e := range v1state.Environments {
_, err = client.EnvironmentCreate(&tpr.Environment{ _, err = client.EnvironmentCreate(&crd.Environment{
Metadata: *tprMetadataFromV1Metadata(&e.Metadata, v1state.NameChanges), Metadata: *crdMetadataFromV1Metadata(&e.Metadata, v1state.NameChanges),
Spec: fission.EnvironmentSpec{ Spec: fission.EnvironmentSpec{
Version: 1, Version: 1,
Runtime: fission.Runtime{ Runtime: fission.Runtime{
@@ -342,9 +342,9 @@ func upgradeRestoreState(c *cli.Context) error {
} }
// create httptriggers // create httptriggers
for _, t := range v1state.Httptriggers { for _, t := range v1state.HTTPTriggers {
_, err = client.HTTPTriggerCreate(&tpr.Httptrigger{ _, err = client.HTTPTriggerCreate(&crd.HTTPTrigger{
Metadata: *tprMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges), Metadata: *crdMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges),
Spec: fission.HTTPTriggerSpec{ Spec: fission.HTTPTriggerSpec{
RelativeURL: t.UrlPattern, RelativeURL: t.UrlPattern,
Method: t.Method, Method: t.Method,
@@ -356,8 +356,8 @@ func upgradeRestoreState(c *cli.Context) error {
// create mqtriggers // create mqtriggers
for _, t := range v1state.Mqtriggers { for _, t := range v1state.Mqtriggers {
_, err = client.MessageQueueTriggerCreate(&tpr.Messagequeuetrigger{ _, err = client.MessageQueueTriggerCreate(&crd.MessageQueueTrigger{
Metadata: *tprMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges), Metadata: *crdMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges),
Spec: fission.MessageQueueTriggerSpec{ Spec: fission.MessageQueueTriggerSpec{
FunctionReference: *functionRefFromV1Metadata(&t.Function, v1state.NameChanges), FunctionReference: *functionRefFromV1Metadata(&t.Function, v1state.NameChanges),
MessageQueueType: t.MessageQueueType, MessageQueueType: t.MessageQueueType,
@@ -369,9 +369,9 @@ func upgradeRestoreState(c *cli.Context) error {
} }
// create time triggers // create time triggers
for _, t := range v1state.Timetriggers { for _, t := range v1state.TimeTriggers {
_, err = client.TimeTriggerCreate(&tpr.Timetrigger{ _, err = client.TimeTriggerCreate(&crd.TimeTrigger{
Metadata: *tprMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges), Metadata: *crdMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges),
Spec: fission.TimeTriggerSpec{ Spec: fission.TimeTriggerSpec{
FunctionReference: *functionRefFromV1Metadata(&t.Function, v1state.NameChanges), FunctionReference: *functionRefFromV1Metadata(&t.Function, v1state.NameChanges),
Cron: t.Cron, Cron: t.Cron,
@@ -382,8 +382,8 @@ func upgradeRestoreState(c *cli.Context) error {
// create watches // create watches
for _, t := range v1state.Watches { for _, t := range v1state.Watches {
_, err = client.WatchCreate(&tpr.Kuberneteswatchtrigger{ _, err = client.WatchCreate(&crd.KubernetesWatchTrigger{
Metadata: *tprMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges), Metadata: *crdMetadataFromV1Metadata(&t.Metadata, v1state.NameChanges),
Spec: fission.KubernetesWatchTriggerSpec{ Spec: fission.KubernetesWatchTriggerSpec{
Namespace: t.Namespace, Namespace: t.Namespace,
Type: t.ObjType, Type: t.ObjType,
+2 -2
View File
@@ -26,7 +26,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func wCreate(c *cli.Context) error { func wCreate(c *cli.Context) error {
@@ -61,7 +61,7 @@ func wCreate(c *cli.Context) error {
// automatically name watches // automatically name watches
watchName := uuid.NewV4().String() watchName := uuid.NewV4().String()
w := &tpr.Kuberneteswatchtrigger{ w := &crd.KubernetesWatchTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: watchName, Name: watchName,
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
Generated
+17 -11
View File
@@ -1,5 +1,5 @@
hash: 285f5f29e18f61b5b834a48ce815fd40e023aa55d51acbc2ac8033cd8267635d hash: 7c938e591b0602b9fd3412aeffd3f1438fc77eaea80c8d9dd03431adb0e1e1c9
updated: 2017-10-14T14:54:26.384349074+08:00 updated: 2017-11-01T16:18:51.144141389+08:00
imports: imports:
- name: cloud.google.com/go - name: cloud.google.com/go
version: 3b1ae45394a234c385be014e9a488f2bb6eef821 version: 3b1ae45394a234c385be014e9a488f2bb6eef821
@@ -14,7 +14,7 @@ imports:
- autorest/azure - autorest/azure
- autorest/date - autorest/date
- name: github.com/coreos/etcd - name: github.com/coreos/etcd
version: 952eb4fadeef3f840bd7557544338c985d4ed0ef version: 3ac54be402ffe4e6df505814456d4931508aaf21
subpackages: subpackages:
- client - client
- name: github.com/davecgh/go-spew - name: github.com/davecgh/go-spew
@@ -33,7 +33,7 @@ imports:
- name: github.com/docopt/docopt-go - name: github.com/docopt/docopt-go
version: 784ddc588536785e7299f7272f39101f7faccc3f version: 784ddc588536785e7299f7272f39101f7faccc3f
- name: github.com/dsnet/compress - name: github.com/dsnet/compress
version: 0ae8e136a5df9e3caf6c0f69983608b07438411b version: c4dbed65594871659ea7347a85e1b8dcd97b9990
subpackages: subpackages:
- bzip2 - bzip2
- bzip2/internal/sais - bzip2/internal/sais
@@ -84,7 +84,7 @@ imports:
- name: github.com/gorilla/mux - name: github.com/gorilla/mux
version: 24fca303ac6da784b9e8269f724ddeb0b2eea5e7 version: 24fca303ac6da784b9e8269f724ddeb0b2eea5e7
- name: github.com/graymeta/stow - name: github.com/graymeta/stow
version: da285caa6daa337ae04a9ac603dbaf9009ffe687 version: 1c51f76db54d79c9db24cb131011632eb586196c
subpackages: subpackages:
- local - local
- name: github.com/hashicorp/golang-lru - name: github.com/hashicorp/golang-lru
@@ -110,7 +110,7 @@ imports:
- jlexer - jlexer
- jwriter - jwriter
- name: github.com/mholt/archiver - name: github.com/mholt/archiver
version: fe92d3d85a514d2752ad3b61ec412b598a2754f9 version: 26cf5bb32d07aa4e8d0de15f56ce516f4641d7df
- name: github.com/nats-io/go-nats - name: github.com/nats-io/go-nats
version: 9147cfac69833916f9c73353ba43f939815c330a version: 9147cfac69833916f9c73353ba43f939815c330a
subpackages: subpackages:
@@ -127,9 +127,9 @@ imports:
- name: github.com/nats-io/nuid - name: github.com/nats-io/nuid
version: 289cccf02c178dc782430d534e3c1f5b72af807f version: 289cccf02c178dc782430d534e3c1f5b72af807f
- name: github.com/nwaples/rardecode - name: github.com/nwaples/rardecode
version: f22b7ef81a0afac9ce1447d37e5ab8e99fbd2f73 version: e06696f847aeda6f39a8f0b7cdff193b7690aef6
- name: github.com/pierrec/lz4 - name: github.com/pierrec/lz4
version: 5a3d2245f97fc249850e7802e3c01fad02a1c316 version: 08c27939df1bd95e881e2c2367a749964ad1fceb
- name: github.com/pierrec/xxHash - name: github.com/pierrec/xxHash
version: a0006b13c722f7f12368c00a3d3c2ae8a999a0c6 version: a0006b13c722f7f12368c00a3d3c2ae8a999a0c6
subpackages: subpackages:
@@ -139,7 +139,7 @@ imports:
- name: github.com/PuerkitoBio/urlesc - name: github.com/PuerkitoBio/urlesc
version: 5bd2802263f21d8788851d5305584c82a5c75d7e version: 5bd2802263f21d8788851d5305584c82a5c75d7e
- name: github.com/robfig/cron - name: github.com/robfig/cron
version: df38d32658d8788cd446ba74db4bb5375c4b0cb3 version: 736158dc09e10f1911ca3a1e1b01f11b566ce5db
- name: github.com/satori/go.uuid - name: github.com/satori/go.uuid
version: 879c5887cd475cd7864858769793b2ceb0d44feb version: 879c5887cd475cd7864858769793b2ceb0d44feb
- name: github.com/sirupsen/logrus - name: github.com/sirupsen/logrus
@@ -213,10 +213,16 @@ imports:
version: 53feefa2559fb8dfa8d81baad31be332c97d6c77 version: 53feefa2559fb8dfa8d81baad31be332c97d6c77
- name: k8s.io/api - name: k8s.io/api
version: 4b8fc5be9b77d91bbb6525d18591c43699a2b4e5 version: 4b8fc5be9b77d91bbb6525d18591c43699a2b4e5
- name: k8s.io/apiextensions-apiserver
version: fcd622fe88a4a6efcb5aea9e94ee87324ac1b036
subpackages: subpackages:
- core/v1 - pkg/apis/apiextensions
- pkg/apis/apiextensions/v1beta1
- pkg/client/clientset/clientset
- pkg/client/clientset/clientset/scheme
- pkg/client/clientset/clientset/typed/apiextensions/v1beta1
- name: k8s.io/apimachinery - name: k8s.io/apimachinery
version: 1fd2e63a9a370677308a42f24fd40c86438afddf version: 8ab5f3d8a330c2e9baaf84e39042db8d49034ae2
subpackages: subpackages:
- pkg/api/equality - pkg/api/equality
- pkg/api/errors - pkg/api/errors
+5 -1
View File
@@ -31,8 +31,12 @@ import:
- rest - rest
- package: k8s.io/api - package: k8s.io/api
version: 4b8fc5be9b77d91bbb6525d18591c43699a2b4e5 version: 4b8fc5be9b77d91bbb6525d18591c43699a2b4e5
- package: k8s.io/apiextensions-apiserver
version: release-1.7
subpackages:
- pkg/apis/apiextensions/v1beta1
- package: k8s.io/apimachinery - package: k8s.io/apimachinery
version: 1fd2e63a9a370677308a42f24fd40c86438afddf version: release-1.7
- package: github.com/influxdata/influxdb - package: github.com/influxdata/influxdb
version: v1.2.0 version: v1.2.0
subpackages: subpackages:
+8 -4
View File
@@ -5,12 +5,16 @@ if [ ! -f ${KUBECONFIG} ]
then then
unset KUBECONFIG unset KUBECONFIG
else else
K="kubectl --kubeconfig $KUBECONFIG" K="kubectl --kubeconfig $KUBECONFIG --namespace default"
if $K get configmap ok-to-destroy if $K get configmap ok-to-destroy
then then
$K get function.fission.io -o name | cut -f2 -d'/' | xargs $K delete function.fission.io $K delete functions --all
$K get environment.fission.io -o name | cut -f2 -d'/' | xargs $K delete environment.fission.io $K delete environments --all
$K get httptrigger.fission.io -o name | cut -f2 -d'/' | xargs $K delete httptrigger.fission.io $K delete httptriggers --all
$K delete kuberneteswatchtriggers --all
$K delete messagequeuetriggers --all
$K delete packages --all
$K delete timetriggers --all
fi fi
fi fi
+8 -8
View File
@@ -36,8 +36,8 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
"github.com/fission/fission/publisher" "github.com/fission/fission/publisher"
"github.com/fission/fission/tpr"
) )
type requestType int type requestType int
@@ -56,7 +56,7 @@ type (
} }
watchSubscription struct { watchSubscription struct {
watch tpr.Kuberneteswatchtrigger watch crd.KubernetesWatchTrigger
kubeWatch watch.Interface kubeWatch watch.Interface
lastResourceVersion string lastResourceVersion string
stopped *int32 stopped *int32
@@ -66,7 +66,7 @@ type (
kubeWatcherRequest struct { kubeWatcherRequest struct {
requestType requestType
watches []tpr.Kuberneteswatchtrigger watches []crd.KubernetesWatchTrigger
responseChannel chan *kubeWatcherResponse responseChannel chan *kubeWatcherResponse
} }
kubeWatcherResponse struct { kubeWatcherResponse struct {
@@ -85,7 +85,7 @@ func MakeKubeWatcher(kubernetesClient *kubernetes.Clientset, publisher publisher
return kw return kw
} }
func (kw *KubeWatcher) Sync(watches []tpr.Kuberneteswatchtrigger) error { func (kw *KubeWatcher) Sync(watches []crd.KubernetesWatchTrigger) error {
req := &kubeWatcherRequest{ req := &kubeWatcherRequest{
requestType: SYNC, requestType: SYNC,
watches: watches, watches: watches,
@@ -145,7 +145,7 @@ func printKubernetesObject(obj runtime.Object, w io.Writer) error {
return err return err
} }
func createKubernetesWatch(kubeClient *kubernetes.Clientset, w *tpr.Kuberneteswatchtrigger, resourceVersion string) (watch.Interface, error) { func createKubernetesWatch(kubeClient *kubernetes.Clientset, w *crd.KubernetesWatchTrigger, resourceVersion string) (watch.Interface, error) {
var wi watch.Interface var wi watch.Interface
var err error var err error
var watchTimeoutSec int64 = 120 var watchTimeoutSec int64 = 120
@@ -174,7 +174,7 @@ func createKubernetesWatch(kubeClient *kubernetes.Clientset, w *tpr.Kuberneteswa
return wi, err return wi, err
} }
func (kw *KubeWatcher) addWatch(w *tpr.Kuberneteswatchtrigger) error { func (kw *KubeWatcher) addWatch(w *crd.KubernetesWatchTrigger) error {
log.Printf("Adding watch %v: %v", w.Metadata.Name, w.Spec.FunctionReference) log.Printf("Adding watch %v: %v", w.Metadata.Name, w.Spec.FunctionReference)
ws, err := MakeWatchSubscription(w, kw.kubernetesClient, kw.publisher) ws, err := MakeWatchSubscription(w, kw.kubernetesClient, kw.publisher)
if err != nil { if err != nil {
@@ -184,7 +184,7 @@ func (kw *KubeWatcher) addWatch(w *tpr.Kuberneteswatchtrigger) error {
return nil return nil
} }
func (kw *KubeWatcher) removeWatch(w *tpr.Kuberneteswatchtrigger) error { func (kw *KubeWatcher) removeWatch(w *crd.KubernetesWatchTrigger) error {
log.Printf("Removing watch %v: %v", w.Metadata.Name, w.Spec.FunctionReference) log.Printf("Removing watch %v: %v", w.Metadata.Name, w.Spec.FunctionReference)
ws, ok := kw.watches[w.Metadata.UID] ws, ok := kw.watches[w.Metadata.UID]
if !ok { if !ok {
@@ -211,7 +211,7 @@ func (kw *KubeWatcher) removeWatch(w *tpr.Kuberneteswatchtrigger) error {
// return nil // return nil
// } // }
func MakeWatchSubscription(w *tpr.Kuberneteswatchtrigger, kubeClient *kubernetes.Clientset, publisher publisher.Publisher) (*watchSubscription, error) { func MakeWatchSubscription(w *crd.KubernetesWatchTrigger, kubeClient *kubernetes.Clientset, publisher publisher.Publisher) (*watchSubscription, error) {
var stopped int32 = 0 var stopped int32 = 0
ws := &watchSubscription{ ws := &watchSubscription{
watch: *w, watch: *w,
+2 -2
View File
@@ -17,12 +17,12 @@ limitations under the License.
package kubewatcher package kubewatcher
import ( import (
"github.com/fission/fission/crd"
"github.com/fission/fission/publisher" "github.com/fission/fission/publisher"
"github.com/fission/fission/tpr"
) )
func Start(routerUrl string) error { func Start(routerUrl string) error {
fissionClient, kubeClient, err := tpr.MakeFissionClient() fissionClient, kubeClient, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
return err return err
} }
+4 -4
View File
@@ -22,17 +22,17 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type ( type (
WatchSync struct { WatchSync struct {
client *tpr.FissionClient client *crd.FissionClient
kubeWatcher *KubeWatcher kubeWatcher *KubeWatcher
} }
) )
func MakeWatchSync(client *tpr.FissionClient, kubeWatcher *KubeWatcher) *WatchSync { func MakeWatchSync(client *crd.FissionClient, kubeWatcher *KubeWatcher) *WatchSync {
ws := &WatchSync{ ws := &WatchSync{
client: client, client: client,
kubeWatcher: kubeWatcher, kubeWatcher: kubeWatcher,
@@ -44,7 +44,7 @@ func MakeWatchSync(client *tpr.FissionClient, kubeWatcher *KubeWatcher) *WatchSy
func (ws *WatchSync) syncSvc() { func (ws *WatchSync) syncSvc() {
// TODO watch instead of polling // TODO watch instead of polling
for { for {
watches, err := ws.client.Kuberneteswatchtriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) watches, err := ws.client.KubernetesWatchTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
log.Fatalf("Failed to get Kubernetes watch trigger list: %v", err) log.Fatalf("Failed to get Kubernetes watch trigger list: %v", err)
} }
+3 -3
View File
@@ -17,15 +17,15 @@ limitations under the License.
package messagequeue package messagequeue
import ( import (
"log"
"os" "os"
"github.com/fission/fission/crd"
"github.com/fission/fission/mqtrigger/messageQueue" "github.com/fission/fission/mqtrigger/messageQueue"
"github.com/fission/fission/tpr"
"log"
) )
func Start(routerUrl string) error { func Start(routerUrl string) error {
fissionClient, _, err := tpr.MakeFissionClient() fissionClient, _, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Fatalf("Failed to get fission client: %v", err) log.Fatalf("Failed to get fission client: %v", err)
} }
+11 -11
View File
@@ -23,7 +23,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
const ( const (
@@ -47,7 +47,7 @@ type (
} }
MessageQueue interface { MessageQueue interface {
subscribe(trigger *tpr.Messagequeuetrigger) (messageQueueSubscription, error) subscribe(trigger *crd.MessageQueueTrigger) (messageQueueSubscription, error)
unsubscribe(triggerSub messageQueueSubscription) error unsubscribe(triggerSub messageQueueSubscription) error
} }
@@ -55,12 +55,12 @@ type (
reqChan chan request reqChan chan request
mqCfg MessageQueueConfig mqCfg MessageQueueConfig
triggers map[string]*triggerSubscription triggers map[string]*triggerSubscription
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
messageQueue MessageQueue messageQueue MessageQueue
} }
triggerSubscription struct { triggerSubscription struct {
trigger tpr.Messagequeuetrigger trigger crd.MessageQueueTrigger
subscription messageQueueSubscription subscription messageQueueSubscription
} }
@@ -75,7 +75,7 @@ type (
} }
) )
func MakeMessageQueueTriggerManager(fissionClient *tpr.FissionClient, routerUrl string, mqConfig MessageQueueConfig) *MessageQueueTriggerManager { func MakeMessageQueueTriggerManager(fissionClient *crd.FissionClient, routerUrl string, mqConfig MessageQueueConfig) *MessageQueueTriggerManager {
var messageQueue MessageQueue var messageQueue MessageQueue
var err error var err error
@@ -105,7 +105,7 @@ func (mqt *MessageQueueTriggerManager) service() {
switch req.requestType { switch req.requestType {
case ADD_TRIGGER: case ADD_TRIGGER:
var err error var err error
k := tpr.CacheKey(&req.triggerSub.trigger.Metadata) k := crd.CacheKey(&req.triggerSub.trigger.Metadata)
if _, ok := mqt.triggers[k]; ok { if _, ok := mqt.triggers[k]; ok {
err = errors.New("Trigger already exists") err = errors.New("Trigger already exists")
} else { } else {
@@ -119,7 +119,7 @@ func (mqt *MessageQueueTriggerManager) service() {
} }
req.respChan <- response{triggers: &copyTriggers} req.respChan <- response{triggers: &copyTriggers}
case DELETE_TRIGGER: case DELETE_TRIGGER:
delete(mqt.triggers, tpr.CacheKey(&req.triggerSub.trigger.Metadata)) delete(mqt.triggers, crd.CacheKey(&req.triggerSub.trigger.Metadata))
} }
} }
} }
@@ -149,7 +149,7 @@ func (mqt *MessageQueueTriggerManager) delTrigger(m *metav1.ObjectMeta) {
mqt.reqChan <- request{ mqt.reqChan <- request{
requestType: DELETE_TRIGGER, requestType: DELETE_TRIGGER,
triggerSub: &triggerSubscription{ triggerSub: &triggerSubscription{
trigger: tpr.Messagequeuetrigger{ trigger: crd.MessageQueueTrigger{
Metadata: *m, Metadata: *m,
}, },
}, },
@@ -159,14 +159,14 @@ func (mqt *MessageQueueTriggerManager) delTrigger(m *metav1.ObjectMeta) {
func (mqt *MessageQueueTriggerManager) syncTriggers() { func (mqt *MessageQueueTriggerManager) syncTriggers() {
for { for {
// get new set of triggers // get new set of triggers
newTriggers, err := mqt.fissionClient.Messagequeuetriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) newTriggers, err := mqt.fissionClient.MessageQueueTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
log.Fatalf("Failed to read message queue trigger list: %v", err) log.Fatalf("Failed to read message queue trigger list: %v", err)
} }
newTriggerMap := make(map[string]*tpr.Messagequeuetrigger) newTriggerMap := make(map[string]*crd.MessageQueueTrigger)
for index := range newTriggers.Items { for index := range newTriggers.Items {
newTrigger := &newTriggers.Items[index] newTrigger := &newTriggers.Items[index]
newTriggerMap[tpr.CacheKey(&newTrigger.Metadata)] = newTrigger newTriggerMap[crd.CacheKey(&newTrigger.Metadata)] = newTrigger
} }
// get current set of triggers // get current set of triggers
+3 -3
View File
@@ -29,7 +29,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
const ( const (
@@ -58,7 +58,7 @@ func makeNatsMessageQueue(routerUrl string, mqCfg MessageQueueConfig) (MessageQu
return nats, nil return nats, nil
} }
func (nats Nats) subscribe(trigger *tpr.Messagequeuetrigger) (messageQueueSubscription, error) { func (nats Nats) subscribe(trigger *crd.MessageQueueTrigger) (messageQueueSubscription, error) {
subj := trigger.Spec.Topic subj := trigger.Spec.Topic
if !isTopicValidForNats(subj) { if !isTopicValidForNats(subj) {
@@ -91,7 +91,7 @@ func isTopicValidForNats(topic string) bool {
return nsUtil.IsSubjectValid(topic, false) return nsUtil.IsSubjectValid(topic, false)
} }
func msgHandler(nats *Nats, trigger *tpr.Messagequeuetrigger) func(*ns.Msg) { func msgHandler(nats *Nats, trigger *crd.MessageQueueTrigger) func(*ns.Msg) {
return func(msg *ns.Msg) { return func(msg *ns.Msg) {
// Support other function ref types // Support other function ref types
+12 -12
View File
@@ -33,7 +33,7 @@ import (
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/cache" "github.com/fission/fission/cache"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type ( type (
@@ -49,16 +49,16 @@ type (
Poolmgr struct { Poolmgr struct {
gpm *GenericPoolManager gpm *GenericPoolManager
functionEnv *cache.Cache // map[string]tpr.Environment functionEnv *cache.Cache // map[string]crd.Environment
fsCache *functionServiceCache fsCache *functionServiceCache
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
fsCreateChannels map[string]*sync.WaitGroup // xxx no channels here, rename this fsCreateChannels map[string]*sync.WaitGroup // xxx no channels here, rename this
requestChan chan *createFuncServiceRequest requestChan chan *createFuncServiceRequest
} }
) )
func MakePoolmgr(gpm *GenericPoolManager, fissionClient *tpr.FissionClient, fissionNs string, fsCache *functionServiceCache) *Poolmgr { func MakePoolmgr(gpm *GenericPoolManager, fissionClient *crd.FissionClient, fissionNs string, fsCache *functionServiceCache) *Poolmgr {
poolMgr := &Poolmgr{ poolMgr := &Poolmgr{
gpm: gpm, gpm: gpm,
functionEnv: cache.MakeCache(10*time.Second, 0), functionEnv: cache.MakeCache(10*time.Second, 0),
@@ -83,13 +83,13 @@ func (poolMgr *Poolmgr) serveCreateFuncServices() {
m := req.funcMeta m := req.funcMeta
// Cache miss -- is this first one to request the func? // Cache miss -- is this first one to request the func?
wg, found := poolMgr.fsCreateChannels[tpr.CacheKey(m)] wg, found := poolMgr.fsCreateChannels[crd.CacheKey(m)]
if !found { if !found {
// create a waitgroup for other requests for // create a waitgroup for other requests for
// the same function to wait on // the same function to wait on
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(1) wg.Add(1)
poolMgr.fsCreateChannels[tpr.CacheKey(m)] = wg poolMgr.fsCreateChannels[crd.CacheKey(m)] = wg
// launch a goroutine for each request, to parallelize // launch a goroutine for each request, to parallelize
// the specialization of different functions // the specialization of different functions
@@ -99,7 +99,7 @@ func (poolMgr *Poolmgr) serveCreateFuncServices() {
address: address, address: address,
err: err, err: err,
} }
delete(poolMgr.fsCreateChannels, tpr.CacheKey(m)) delete(poolMgr.fsCreateChannels, crd.CacheKey(m))
wg.Done() wg.Done()
}() }()
} else { } else {
@@ -149,13 +149,13 @@ func (poolMgr *Poolmgr) getServiceForFunctionApi(w http.ResponseWriter, r *http.
w.Write([]byte(serviceName)) w.Write([]byte(serviceName))
} }
func (poolMgr *Poolmgr) getFunctionEnv(m *metav1.ObjectMeta) (*tpr.Environment, error) { func (poolMgr *Poolmgr) getFunctionEnv(m *metav1.ObjectMeta) (*crd.Environment, error) {
var env *tpr.Environment var env *crd.Environment
// Cached ? // Cached ?
result, err := poolMgr.functionEnv.Get(tpr.CacheKey(m)) result, err := poolMgr.functionEnv.Get(crd.CacheKey(m))
if err == nil { if err == nil {
env = result.(*tpr.Environment) env = result.(*crd.Environment)
return env, nil return env, nil
} }
@@ -173,7 +173,7 @@ func (poolMgr *Poolmgr) getFunctionEnv(m *metav1.ObjectMeta) (*tpr.Environment,
} }
// cache for future lookups // cache for future lookups
poolMgr.functionEnv.Set(tpr.CacheKey(m), env) poolMgr.functionEnv.Set(crd.CacheKey(m), env)
return env, nil return env, nil
} }
+8 -8
View File
@@ -24,7 +24,7 @@ import (
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/cache" "github.com/fission/fission/cache"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type fscRequestType int type fscRequestType int
@@ -39,7 +39,7 @@ const (
type ( type (
funcSvc struct { funcSvc struct {
function *metav1.ObjectMeta // function this pod/service is for function *metav1.ObjectMeta // function this pod/service is for
environment *tpr.Environment // function's environment environment *crd.Environment // function's environment
address string // Host:Port or IP:Port that the function's service can be reached at. address string // Host:Port or IP:Port that the function's service can be reached at.
podName string // pod name (within the function namespace) podName string // pod name (within the function namespace)
@@ -94,7 +94,7 @@ func (fsc *functionServiceCache) service() {
pods := make([]string, 0) pods := make([]string, 0)
for podNameI, mI := range byPodCopy { for podNameI, mI := range byPodCopy {
m := mI.(metav1.ObjectMeta) m := mI.(metav1.ObjectMeta)
fsvcI, err := fsc.byFunction.Get(tpr.CacheKey(&m)) fsvcI, err := fsc.byFunction.Get(crd.CacheKey(&m))
if err != nil { if err != nil {
resp.error = err resp.error = err
} else { } else {
@@ -123,7 +123,7 @@ func (fsc *functionServiceCache) service() {
} }
func (fsc *functionServiceCache) GetByFunction(m *metav1.ObjectMeta) (*funcSvc, error) { func (fsc *functionServiceCache) GetByFunction(m *metav1.ObjectMeta) (*funcSvc, error) {
key := tpr.CacheKey(m) key := crd.CacheKey(m)
fsvcI, err := fsc.byFunction.Get(key) fsvcI, err := fsc.byFunction.Get(key)
if err != nil { if err != nil {
@@ -140,7 +140,7 @@ func (fsc *functionServiceCache) GetByFunction(m *metav1.ObjectMeta) (*funcSvc,
// TODO: error should be second return // TODO: error should be second return
func (fsc *functionServiceCache) Add(fsvc funcSvc) (error, *funcSvc) { func (fsc *functionServiceCache) Add(fsvc funcSvc) (error, *funcSvc) {
err, existing := fsc.byFunction.Set(tpr.CacheKey(fsvc.function), &fsvc) err, existing := fsc.byFunction.Set(crd.CacheKey(fsvc.function), &fsvc)
if err != nil { if err != nil {
if existing != nil { if existing != nil {
f := existing.(*funcSvc) f := existing.(*funcSvc)
@@ -199,7 +199,7 @@ func (fsc *functionServiceCache) _touchByAddress(address string) error {
return err return err
} }
m := mI.(metav1.ObjectMeta) m := mI.(metav1.ObjectMeta)
fsvcI, err := fsc.byFunction.Get(tpr.CacheKey(&m)) fsvcI, err := fsc.byFunction.Get(crd.CacheKey(&m))
if err != nil { if err != nil {
return err return err
} }
@@ -228,7 +228,7 @@ func (fsc *functionServiceCache) _deleteByPod(podName string, minAge time.Durati
return false, err return false, err
} }
m := mI.(metav1.ObjectMeta) m := mI.(metav1.ObjectMeta)
fsvcI, err := fsc.byFunction.Get(tpr.CacheKey(&m)) fsvcI, err := fsc.byFunction.Get(crd.CacheKey(&m))
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -238,7 +238,7 @@ func (fsc *functionServiceCache) _deleteByPod(podName string, minAge time.Durati
return false, nil return false, nil
} }
fsc.byFunction.Delete(tpr.CacheKey(&m)) fsc.byFunction.Delete(crd.CacheKey(&m))
fsc.byAddress.Delete(fsvc.address) fsc.byAddress.Delete(fsvc.address)
fsc.byPod.Delete(podName) fsc.byPod.Delete(podName)
return true, nil return true, nil
+2 -2
View File
@@ -8,7 +8,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func TestFunctionServiceCache(t *testing.T) { func TestFunctionServiceCache(t *testing.T) {
@@ -25,7 +25,7 @@ func TestFunctionServiceCache(t *testing.T) {
Name: "foo", Name: "foo",
UID: "1212", UID: "1212",
}, },
environment: &tpr.Environment{ environment: &crd.Environment{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "foo-env", Name: "foo-env",
UID: "2323", UID: "2323",
+5 -5
View File
@@ -40,10 +40,10 @@ import (
"k8s.io/client-go/pkg/apis/extensions/v1beta1" "k8s.io/client-go/pkg/apis/extensions/v1beta1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
"github.com/fission/fission/environments/fetcher" "github.com/fission/fission/environments/fetcher"
fetcherClient "github.com/fission/fission/environments/fetcher/client" fetcherClient "github.com/fission/fission/environments/fetcher/client"
"github.com/fission/fission/logger" "github.com/fission/fission/logger"
"github.com/fission/fission/tpr"
) )
const POOLMGR_INSTANCEID_LABEL string = "poolmgrInstanceId" const POOLMGR_INSTANCEID_LABEL string = "poolmgrInstanceId"
@@ -51,7 +51,7 @@ const POD_PHASE_RUNNING string = "Running"
type ( type (
GenericPool struct { GenericPool struct {
env *tpr.Environment env *crd.Environment
replicas int32 // num idle pods replicas int32 // num idle pods
deployment *v1beta1.Deployment // kubernetes deployment deployment *v1beta1.Deployment // kubernetes deployment
namespace string // namespace to keep our resources namespace string // namespace to keep our resources
@@ -64,7 +64,7 @@ type (
fetcherImagePullPolicy apiv1.PullPolicy fetcherImagePullPolicy apiv1.PullPolicy
runtimeImagePullPolicy apiv1.PullPolicy // pull policy for generic pool to created env deployment runtimeImagePullPolicy apiv1.PullPolicy // pull policy for generic pool to created env deployment
kubernetesClient *kubernetes.Clientset kubernetesClient *kubernetes.Clientset
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
instanceId string // poolmgr instance id instanceId string // poolmgr instance id
labelsForPool map[string]string labelsForPool map[string]string
requestChannel chan *choosePodRequest requestChannel chan *choosePodRequest
@@ -94,9 +94,9 @@ func getImagePullPolicy(policy string) apiv1.PullPolicy {
} }
func MakeGenericPool( func MakeGenericPool(
fissionClient *tpr.FissionClient, fissionClient *crd.FissionClient,
kubernetesClient *kubernetes.Clientset, kubernetesClient *kubernetes.Clientset,
env *tpr.Environment, env *crd.Environment,
initialReplicas int32, initialReplicas int32,
namespace string, namespace string,
fsCache *functionServiceCache, fsCache *functionServiceCache,
+10 -10
View File
@@ -24,7 +24,7 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type requestType int type requestType int
@@ -39,15 +39,15 @@ type (
pools map[string]*GenericPool pools map[string]*GenericPool
kubernetesClient *kubernetes.Clientset kubernetesClient *kubernetes.Clientset
namespace string namespace string
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
fsCache *functionServiceCache fsCache *functionServiceCache
instanceId string instanceId string
requestChannel chan *request requestChannel chan *request
} }
request struct { request struct {
requestType requestType
env *tpr.Environment env *crd.Environment
envList []tpr.Environment envList []crd.Environment
responseChannel chan *response responseChannel chan *response
} }
response struct { response struct {
@@ -57,7 +57,7 @@ type (
) )
func MakeGenericPoolManager( func MakeGenericPoolManager(
fissionClient *tpr.FissionClient, fissionClient *crd.FissionClient,
kubernetesClient *kubernetes.Clientset, kubernetesClient *kubernetes.Clientset,
fissionNamespace string, fissionNamespace string,
functionNamespace string, functionNamespace string,
@@ -85,7 +85,7 @@ func (gpm *GenericPoolManager) service() {
switch req.requestType { switch req.requestType {
case GET_POOL: case GET_POOL:
var err error var err error
pool, ok := gpm.pools[tpr.CacheKey(&req.env.Metadata)] pool, ok := gpm.pools[crd.CacheKey(&req.env.Metadata)]
if !ok { if !ok {
var poolSize int32 = 3 // TODO configurable/autoscalable var poolSize int32 = 3 // TODO configurable/autoscalable
switch req.env.Spec.AllowedFunctionsPerContainer { switch req.env.Spec.AllowedFunctionsPerContainer {
@@ -100,13 +100,13 @@ func (gpm *GenericPoolManager) service() {
req.responseChannel <- &response{error: err} req.responseChannel <- &response{error: err}
continue continue
} }
gpm.pools[tpr.CacheKey(&req.env.Metadata)] = pool gpm.pools[crd.CacheKey(&req.env.Metadata)] = pool
} }
req.responseChannel <- &response{pool: pool} req.responseChannel <- &response{pool: pool}
case CLEANUP_POOLS: case CLEANUP_POOLS:
latestEnvSet := make(map[string]bool) latestEnvSet := make(map[string]bool)
for _, env := range req.envList { for _, env := range req.envList {
latestEnvSet[tpr.CacheKey(&env.Metadata)] = true latestEnvSet[crd.CacheKey(&env.Metadata)] = true
} }
for key, pool := range gpm.pools { for key, pool := range gpm.pools {
_, ok := latestEnvSet[key] _, ok := latestEnvSet[key]
@@ -124,7 +124,7 @@ func (gpm *GenericPoolManager) service() {
} }
} }
func (gpm *GenericPoolManager) GetPool(env *tpr.Environment) (*GenericPool, error) { func (gpm *GenericPoolManager) GetPool(env *crd.Environment) (*GenericPool, error) {
c := make(chan *response) c := make(chan *response)
gpm.requestChannel <- &request{ gpm.requestChannel <- &request{
requestType: GET_POOL, requestType: GET_POOL,
@@ -135,7 +135,7 @@ func (gpm *GenericPoolManager) GetPool(env *tpr.Environment) (*GenericPool, erro
return resp.pool, resp.error return resp.pool, resp.error
} }
func (gpm *GenericPoolManager) CleanupPools(envs []tpr.Environment) { func (gpm *GenericPoolManager) CleanupPools(envs []crd.Environment) {
gpm.requestChannel <- &request{ gpm.requestChannel <- &request{
requestType: CLEANUP_POOLS, requestType: CLEANUP_POOLS,
envList: envs, envList: envs,
+2 -2
View File
@@ -21,12 +21,12 @@ import (
"github.com/dchest/uniuri" "github.com/dchest/uniuri"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
// Start the poolmgr service. // Start the poolmgr service.
func StartPoolmgr(fissionNamespace string, functionNamespace string, port int) error { func StartPoolmgr(fissionNamespace string, functionNamespace string, port int) error {
fissionClient, kubernetesClient, err := tpr.MakeFissionClient() fissionClient, kubernetesClient, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Printf("Failed to get kubernetes client: %v", err) log.Printf("Failed to get kubernetes client: %v", err)
return err return err
+32 -22
View File
@@ -39,14 +39,14 @@ import (
apiv1 "k8s.io/client-go/pkg/api/v1" apiv1 "k8s.io/client-go/pkg/api/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
"github.com/fission/fission/poolmgr/client" "github.com/fission/fission/poolmgr/client"
"github.com/fission/fission/tpr"
) )
// return the number of pods in the given namespace matching the given labels // return the number of pods in the given namespace matching the given labels
func countPods(kubeClient *kubernetes.Clientset, ns string, labelz map[string]string) int { func countPods(kubeClient *kubernetes.Clientset, ns string, labelz map[string]string) int {
pods, err := kubeClient.Pods(ns).List(metav1.ListOptions{ pods, err := kubeClient.Pods(ns).List(metav1.ListOptions{
LabelSelector: labels.Set(labelz).AsSelector(), LabelSelector: labels.Set(labelz).AsSelector().String(),
}) })
if err != nil { if err != nil {
log.Panicf("Failed to list pods: %v", err) log.Panicf("Failed to list pods: %v", err)
@@ -120,8 +120,8 @@ func TestPoolmgr(t *testing.T) {
} }
// connect to k8s // connect to k8s
// and get TPR client // and get CRD client
fissionClient, kubeClient, err := tpr.MakeFissionClient() fissionClient, kubeClient, apiExtClient, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Panicf("failed to connect: %v", err) log.Panicf("failed to connect: %v", err)
} }
@@ -133,16 +133,16 @@ func TestPoolmgr(t *testing.T) {
createTestNamespace(kubeClient, functionNs) createTestNamespace(kubeClient, functionNs)
defer kubeClient.Namespaces().Delete(functionNs, nil) defer kubeClient.Namespaces().Delete(functionNs, nil)
// make sure TPR types exist on cluster // make sure CRD types exist on cluster
err = tpr.EnsureFissionTPRs(kubeClient) err = crd.EnsureFissionCRDs(apiExtClient)
if err != nil { if err != nil {
log.Panicf("failed to ensure tprs: %v", err) log.Panicf("failed to ensure crds: %v", err)
} }
fissionClient.WaitForTPRs() fissionClient.WaitForCRDs()
// create an env on the cluster // create an env on the cluster
env, err := fissionClient.Environments(fissionNs).Create(&tpr.Environment{ env, err := fissionClient.Environments(fissionNs).Create(&crd.Environment{
Metadata: metametav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "nodejs", Name: "nodejs",
Namespace: fissionNs, Namespace: fissionNs,
}, },
@@ -173,37 +173,47 @@ func TestPoolmgr(t *testing.T) {
// waitForPool(functionNs, "nodejs") // waitForPool(functionNs, "nodejs")
time.Sleep(6 * time.Second) time.Sleep(6 * time.Second)
envRef := fission.EnvironmentReference{
Namespace: env.Metadata.Namespace,
Name: env.Metadata.Name,
}
deployment := fission.Archive{
Type: fission.ArchiveTypeLiteral,
Literal: []byte(`module.exports = async function(context) { return { status: 200, body: "Hello, world!\n" }; }`),
}
// create a package // create a package
p := &tpr.Package{ p := &crd.Package{
Metadata: metametav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: fissionNs, Namespace: fissionNs,
}, },
Spec: fission.PackageSpec{ Spec: fission.PackageSpec{
Type: fission.PackageTypeLiteral, Environment: envRef,
Literal: []byte(`module.exports = async function(context) { return { status: 200, body: "Hello, world!\n" }; }`), Deployment: deployment,
}, },
} }
_, err = fissionClient.Packages(fissionNs).Create(p) p, err = fissionClient.Packages(fissionNs).Create(p)
if err != nil { if err != nil {
log.Panicf("failed to create package: %v", err) log.Panicf("failed to create package: %v", err)
} }
// create a function // create a function
f := &tpr.Function{ f := &crd.Function{
Metadata: metametav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "hello", Name: "hello",
Namespace: fissionNs, Namespace: fissionNs,
}, },
Spec: fission.FunctionSpec{ Spec: fission.FunctionSpec{
Source: fission.FunctionPackageRef{}, Environment: envRef,
Deployment: fission.FunctionPackageRef{ Package: fission.FunctionPackageRef{
PackageRef: fission.PackageRef{ PackageRef: fission.PackageRef{
Name: p.Metadata.Name, Namespace: p.Metadata.Namespace,
Namespace: p.Metadata.Namespace, Name: p.Metadata.Name,
ResourceVersion: p.Metadata.ResourceVersion,
}, },
}, },
EnvironmentName: env.Metadata.Name,
}, },
} }
_, err = fissionClient.Functions(fissionNs).Create(f) _, err = fissionClient.Functions(fissionNs).Create(f)
+12 -12
View File
@@ -29,14 +29,14 @@ import (
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/cache" "github.com/fission/fission/cache"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type ( type (
// functionReferenceResolver provides a resolver to turn a function // functionReferenceResolver provides a resolver to turn a function
// reference into a resolveResult // reference into a resolveResult
functionReferenceResolver struct { functionReferenceResolver struct {
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
// FunctionReference -> function metadata // FunctionReference -> function metadata
refCache *cache.Cache refCache *cache.Cache
@@ -68,7 +68,7 @@ const (
resolveResultSingleFunction = iota resolveResultSingleFunction = iota
) )
func makeFunctionReferenceResolver(fissionClient *tpr.FissionClient) *functionReferenceResolver { func makeFunctionReferenceResolver(fissionClient *crd.FissionClient) *functionReferenceResolver {
frr := &functionReferenceResolver{ frr := &functionReferenceResolver{
fissionClient: fissionClient, fissionClient: fissionClient,
refCache: cache.MakeCache(time.Minute, 0), refCache: cache.MakeCache(time.Minute, 0),
@@ -76,22 +76,22 @@ func makeFunctionReferenceResolver(fissionClient *tpr.FissionClient) *functionRe
return frr return frr
} }
// Sync starts syncing tpr function resources from k8s api server // Sync starts syncing crd function resources from k8s api server
func (frr *functionReferenceResolver) Sync(tprClient *rest.RESTClient) { func (frr *functionReferenceResolver) Sync(crdClient *rest.RESTClient) {
stopCh := make(chan struct{}) stopCh := make(chan struct{})
store, controller := makeK8SCache(tprClient) store, controller := makeK8SCache(crdClient)
frr.stopCh = stopCh frr.stopCh = stopCh
frr.store = store frr.store = store
go controller.Run(stopCh) go controller.Run(stopCh)
} }
// Stop stops tpr resources syncing // Stop stops crd resources syncing
func (frr *functionReferenceResolver) Stop() { func (frr *functionReferenceResolver) Stop() {
frr.stopCh <- struct{}{} frr.stopCh <- struct{}{}
} }
func makeK8SCache(tprClient *rest.RESTClient) (k8sCache.Store, k8sCache.Controller) { func makeK8SCache(crdClient *rest.RESTClient) (k8sCache.Store, k8sCache.Controller) {
watchlist := k8sCache.NewListWatchFromClient(tprClient, "functions", metav1.NamespaceDefault, fields.Everything()) watchlist := k8sCache.NewListWatchFromClient(crdClient, "functions", metav1.NamespaceDefault, fields.Everything())
listWatch := &k8sCache.ListWatch{ listWatch := &k8sCache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
return watchlist.List(options) return watchlist.List(options)
@@ -101,7 +101,7 @@ func makeK8SCache(tprClient *rest.RESTClient) (k8sCache.Store, k8sCache.Controll
}, },
} }
resyncPeriod := 30 * time.Second resyncPeriod := 30 * time.Second
return k8sCache.NewInformer(listWatch, &tpr.Function{}, resyncPeriod, return k8sCache.NewInformer(listWatch, &crd.Function{}, resyncPeriod,
k8sCache.ResourceEventHandlerFuncs{}) k8sCache.ResourceEventHandlerFuncs{})
} }
@@ -145,7 +145,7 @@ func (frr *functionReferenceResolver) resolve(namespace string, fr *fission.Func
// resolveByName simply looks up function by name in a namespace. // resolveByName simply looks up function by name in a namespace.
func (frr *functionReferenceResolver) resolveByName(namespace, name string) (*resolveResult, error) { func (frr *functionReferenceResolver) resolveByName(namespace, name string) (*resolveResult, error) {
// get function from cache // get function from cache
obj, isExist, err := frr.store.Get(&tpr.Function{ obj, isExist, err := frr.store.Get(&crd.Function{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Namespace: namespace, Namespace: namespace,
Name: name, Name: name,
@@ -158,7 +158,7 @@ func (frr *functionReferenceResolver) resolveByName(namespace, name string) (*re
return nil, fmt.Errorf("function %v does not exist", name) return nil, fmt.Errorf("function %v does not exist", name)
} }
f := obj.(*tpr.Function) f := obj.(*crd.Function)
rr := resolveResult{ rr := resolveResult{
resolveResultType: resolveResultSingleFunction, resolveResultType: resolveResultSingleFunction,
functionMetadata: &f.Metadata, functionMetadata: &f.Metadata,
+16 -16
View File
@@ -30,31 +30,31 @@ import (
k8sCache "k8s.io/client-go/tools/cache" k8sCache "k8s.io/client-go/tools/cache"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
poolmgrClient "github.com/fission/fission/poolmgr/client" poolmgrClient "github.com/fission/fission/poolmgr/client"
"github.com/fission/fission/tpr"
) )
type HTTPTriggerSet struct { type HTTPTriggerSet struct {
*functionServiceMap *functionServiceMap
*mutableRouter *mutableRouter
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
poolmgr *poolmgrClient.Client poolmgr *poolmgrClient.Client
resolver *functionReferenceResolver resolver *functionReferenceResolver
triggers []tpr.Httptrigger triggers []crd.HTTPTrigger
functions []tpr.Function functions []crd.Function
tprClient *rest.RESTClient crdClient *rest.RESTClient
} }
func makeHTTPTriggerSet(fmap *functionServiceMap, fissionClient *tpr.FissionClient, func makeHTTPTriggerSet(fmap *functionServiceMap, fissionClient *crd.FissionClient,
poolmgr *poolmgrClient.Client, resolver *functionReferenceResolver, tprClient *rest.RESTClient) *HTTPTriggerSet { poolmgr *poolmgrClient.Client, resolver *functionReferenceResolver, crdClient *rest.RESTClient) *HTTPTriggerSet {
triggers := make([]tpr.Httptrigger, 1) triggers := make([]crd.HTTPTrigger, 1)
return &HTTPTriggerSet{ return &HTTPTriggerSet{
functionServiceMap: fmap, functionServiceMap: fmap,
triggers: triggers, triggers: triggers,
fissionClient: fissionClient, fissionClient: fissionClient,
poolmgr: poolmgr, poolmgr: poolmgr,
resolver: resolver, resolver: resolver,
tprClient: tprClient, crdClient: crdClient,
} }
} }
@@ -134,7 +134,7 @@ func (ts *HTTPTriggerSet) getRouter() *mux.Router {
return muxRouter return muxRouter
} }
func (ts *HTTPTriggerSet) updateTriggerStatusFailed(ht *tpr.Httptrigger, err error) { func (ts *HTTPTriggerSet) updateTriggerStatusFailed(ht *crd.HTTPTrigger, err error) {
// TODO // TODO
} }
@@ -142,7 +142,7 @@ func (ts *HTTPTriggerSet) watchTriggers() {
// sync all http triggers // sync all http triggers
ts.syncTriggers() ts.syncTriggers()
watchlist := k8sCache.NewListWatchFromClient(ts.tprClient, "httptriggers", metav1.NamespaceDefault, fields.Everything()) watchlist := k8sCache.NewListWatchFromClient(ts.crdClient, "httptriggers", metav1.NamespaceDefault, fields.Everything())
listWatch := &k8sCache.ListWatch{ listWatch := &k8sCache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
return watchlist.List(options) return watchlist.List(options)
@@ -152,7 +152,7 @@ func (ts *HTTPTriggerSet) watchTriggers() {
}, },
} }
resyncPeriod := 30 * time.Second resyncPeriod := 30 * time.Second
_, controller := k8sCache.NewInformer(listWatch, &tpr.Httptrigger{}, resyncPeriod, _, controller := k8sCache.NewInformer(listWatch, &crd.HTTPTrigger{}, resyncPeriod,
k8sCache.ResourceEventHandlerFuncs{ k8sCache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
ts.syncTriggers() ts.syncTriggers()
@@ -174,7 +174,7 @@ func (ts *HTTPTriggerSet) watchTriggers() {
func (ts *HTTPTriggerSet) watchFunctions() { func (ts *HTTPTriggerSet) watchFunctions() {
ts.syncTriggers() ts.syncTriggers()
watchlist := k8sCache.NewListWatchFromClient(ts.tprClient, "functions", metav1.NamespaceDefault, fields.Everything()) watchlist := k8sCache.NewListWatchFromClient(ts.crdClient, "functions", metav1.NamespaceDefault, fields.Everything())
listWatch := &k8sCache.ListWatch{ listWatch := &k8sCache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
return watchlist.List(options) return watchlist.List(options)
@@ -184,7 +184,7 @@ func (ts *HTTPTriggerSet) watchFunctions() {
}, },
} }
resyncPeriod := 30 * time.Second resyncPeriod := 30 * time.Second
_, controller := k8sCache.NewInformer(listWatch, &tpr.Function{}, resyncPeriod, _, controller := k8sCache.NewInformer(listWatch, &crd.Function{}, resyncPeriod,
k8sCache.ResourceEventHandlerFuncs{ k8sCache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {
ts.syncTriggers() ts.syncTriggers()
@@ -193,7 +193,7 @@ func (ts *HTTPTriggerSet) watchFunctions() {
ts.syncTriggers() ts.syncTriggers()
}, },
UpdateFunc: func(oldObj interface{}, newObj interface{}) { UpdateFunc: func(oldObj interface{}, newObj interface{}) {
fn := newObj.(*tpr.Function) fn := newObj.(*crd.Function)
// update resolver function reference cache // update resolver function reference cache
for key, rr := range ts.resolver.copy() { for key, rr := range ts.resolver.copy() {
if key.functionReference.Name == fn.Metadata.Name && if key.functionReference.Name == fn.Metadata.Name &&
@@ -219,7 +219,7 @@ func (ts *HTTPTriggerSet) syncTriggers() {
log.Printf("Syncing http triggers") log.Printf("Syncing http triggers")
// get triggers // get triggers
triggers, err := ts.fissionClient.Httptriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) triggers, err := ts.fissionClient.HTTPTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
log.Fatalf("Failed to get http trigger list: %v", err) log.Fatalf("Failed to get http trigger list: %v", err)
} }
+3 -3
View File
@@ -49,8 +49,8 @@ import (
"github.com/gorilla/handlers" "github.com/gorilla/handlers"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/fission/fission/crd"
poolmgrClient "github.com/fission/fission/poolmgr/client" poolmgrClient "github.com/fission/fission/poolmgr/client"
"github.com/fission/fission/tpr"
) )
// request url ---[mux]---> Function(name,uid) ----[fmap]----> k8s service url // request url ---[mux]---> Function(name,uid) ----[fmap]----> k8s service url
@@ -73,11 +73,11 @@ func serve(port int, httpTriggerSet *HTTPTriggerSet) {
func Start(port int, poolmgrUrl string) { func Start(port int, poolmgrUrl string) {
fmap := makeFunctionServiceMap(time.Minute) fmap := makeFunctionServiceMap(time.Minute)
fissionClient, _, err := tpr.MakeFissionClient() fissionClient, _, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
log.Fatalf("Error connecting to kubernetes API: %v", err) log.Fatalf("Error connecting to kubernetes API: %v", err)
} }
restClient := fissionClient.GetTprClient() restClient := fissionClient.GetCrdClient()
poolmgr := poolmgrClient.MakeClient(poolmgrUrl) poolmgr := poolmgrClient.MakeClient(poolmgrUrl)
resolver := makeFunctionReferenceResolver(fissionClient) resolver := makeFunctionReferenceResolver(fissionClient)
resolver.Sync(restClient) resolver.Sync(restClient)
+2 -2
View File
@@ -24,7 +24,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
func TestRouter(t *testing.T) { func TestRouter(t *testing.T) {
@@ -61,7 +61,7 @@ func TestRouter(t *testing.T) {
triggers := makeHTTPTriggerSet(fmap, nil, nil, frr, nil) triggers := makeHTTPTriggerSet(fmap, nil, nil, frr, nil)
triggerUrl := "/foo" triggerUrl := "/foo"
triggers.triggers = append(triggers.triggers, triggers.triggers = append(triggers.triggers,
tpr.Httptrigger{ crd.HTTPTrigger{
Metadata: metav1.ObjectMeta{ Metadata: metav1.ObjectMeta{
Name: "xxx", Name: "xxx",
Namespace: metav1.NamespaceDefault, Namespace: metav1.NamespaceDefault,
+16 -7
View File
@@ -87,6 +87,13 @@ build_fission_cli() {
popd popd
} }
clean_tpr_crd_resources() {
# clean tpr & crd resources to avoid testing error (ex. no kind "HttptriggerList" is registered for version "fission.io/v1")
# thirdpartyresources part should be removed after kubernetes test cluster is upgrade to 1.8+
kubectl --namespace default get thirdpartyresources| grep -v NAME| grep "fission.io"| awk '{print $1}'|xargs -I@ bash -c "kubectl --namespace default delete thirdpartyresources @" || true
kubectl --namespace default get crd| grep -v NAME| grep "fission.io"| awk '{print $1}'|xargs -I@ bash -c "kubectl --namespace default delete crd @" || true
}
generate_test_id() { generate_test_id() {
echo $(date|md5sum|cut -c1-6) echo $(date|md5sum|cut -c1-6)
} }
@@ -192,18 +199,18 @@ dump_fission_logs() {
echo --- end $component logs --- echo --- end $component logs ---
} }
dump_fission_tpr() { dump_fission_crd() {
type=$1 type=$1
echo --- All objects of type $type --- echo --- All objects of type $type ---
kubectl --all-namespaces=true get $type -o yaml kubectl --all-namespaces=true get $type -o yaml
echo --- End objects of type $type --- echo --- End objects of type $type ---
} }
dump_fission_tprs() { dump_fission_crds() {
dump_fission_tpr function.fission.io dump_fission_crd function.fission.io
dump_fission_tpr package.fission.io dump_fission_crd package.fission.io
dump_fission_tpr httptrigger.fission.io dump_fission_crd httptrigger.fission.io
dump_fission_tpr environment.fission.io dump_fission_crd environment.fission.io
} }
dump_env_pods() { dump_env_pods() {
@@ -234,7 +241,7 @@ dump_logs() {
dump_fission_logs $ns $fns router dump_fission_logs $ns $fns router
dump_fission_logs $ns $fns poolmgr dump_fission_logs $ns $fns poolmgr
dump_function_pod_logs $ns $fns dump_function_pod_logs $ns $fns
dump_fission_tprs dump_fission_crds
} }
export FAILURES=0 export FAILURES=0
@@ -267,6 +274,8 @@ install_and_test() {
controllerPort=31234 controllerPort=31234
routerPort=31235 routerPort=31235
clean_tpr_crd_resources
id=$(generate_test_id) id=$(generate_test_id)
trap "helm_uninstall_fission $id" EXIT trap "helm_uninstall_fission $id" EXIT
if ! helm_install_fission $id $image $imageTag $fetcherImage $fetcherImageTag $controllerPort $routerPort if ! helm_install_fission $id $image $imageTag $fetcherImage $fetcherImageTag $controllerPort $routerPort
+2 -2
View File
@@ -17,12 +17,12 @@ limitations under the License.
package timer package timer
import ( import (
"github.com/fission/fission/crd"
"github.com/fission/fission/publisher" "github.com/fission/fission/publisher"
"github.com/fission/fission/tpr"
) )
func Start(routerUrl string) error { func Start(routerUrl string) error {
fissionClient, _, err := tpr.MakeFissionClient() fissionClient, _, _, err := crd.MakeFissionClient()
if err != nil { if err != nil {
return err return err
} }
+6 -6
View File
@@ -22,8 +22,8 @@ import (
"github.com/robfig/cron" "github.com/robfig/cron"
"github.com/fission/fission" "github.com/fission/fission"
"github.com/fission/fission/crd"
"github.com/fission/fission/publisher" "github.com/fission/fission/publisher"
"github.com/fission/fission/tpr"
) )
type requestType int type requestType int
@@ -41,14 +41,14 @@ type (
timerRequest struct { timerRequest struct {
requestType requestType
triggers []tpr.Timetrigger triggers []crd.TimeTrigger
responseChannel chan *timerResponse responseChannel chan *timerResponse
} }
timerResponse struct { timerResponse struct {
error error
} }
timerTriggerWithCron struct { timerTriggerWithCron struct {
trigger tpr.Timetrigger trigger crd.TimeTrigger
cron *cron.Cron cron *cron.Cron
} }
) )
@@ -63,7 +63,7 @@ func MakeTimer(publisher publisher.Publisher) *Timer {
return timer return timer
} }
func (timer *Timer) Sync(triggers []tpr.Timetrigger) error { func (timer *Timer) Sync(triggers []crd.TimeTrigger) error {
req := &timerRequest{ req := &timerRequest{
requestType: SYNC, requestType: SYNC,
triggers: triggers, triggers: triggers,
@@ -85,7 +85,7 @@ func (timer *Timer) svc() {
} }
} }
func (timer *Timer) syncCron(triggers []tpr.Timetrigger) error { func (timer *Timer) syncCron(triggers []crd.TimeTrigger) error {
// add new triggers or update existing ones // add new triggers or update existing ones
for _, t := range triggers { for _, t := range triggers {
if item, ok := timer.triggers[t.Metadata.Name]; ok { if item, ok := timer.triggers[t.Metadata.Name]; ok {
@@ -137,7 +137,7 @@ func (timer *Timer) syncCron(triggers []tpr.Timetrigger) error {
return nil return nil
} }
func (timer *Timer) newCron(t tpr.Timetrigger) *cron.Cron { func (timer *Timer) newCron(t crd.TimeTrigger) *cron.Cron {
c := cron.New() c := cron.New()
c.AddFunc(t.Spec.Cron, func() { c.AddFunc(t.Spec.Cron, func() {
headers := map[string]string{ headers := map[string]string{
+4 -4
View File
@@ -22,17 +22,17 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/fission/fission/tpr" "github.com/fission/fission/crd"
) )
type ( type (
TimerSync struct { TimerSync struct {
fissionClient *tpr.FissionClient fissionClient *crd.FissionClient
timer *Timer timer *Timer
} }
) )
func MakeTimerSync(fissionClient *tpr.FissionClient, timer *Timer) *TimerSync { func MakeTimerSync(fissionClient *crd.FissionClient, timer *Timer) *TimerSync {
ws := &TimerSync{ ws := &TimerSync{
fissionClient: fissionClient, fissionClient: fissionClient,
timer: timer, timer: timer,
@@ -43,7 +43,7 @@ func MakeTimerSync(fissionClient *tpr.FissionClient, timer *Timer) *TimerSync {
func (ws *TimerSync) syncSvc() { func (ws *TimerSync) syncSvc() {
for { for {
triggers, err := ws.fissionClient.Timetriggers(metav1.NamespaceAll).List(metav1.ListOptions{}) triggers, err := ws.fissionClient.TimeTriggers(metav1.NamespaceAll).List(metav1.ListOptions{})
if err != nil { if err != nil {
log.Fatalf("Failed get time trigger list: %v", err) log.Fatalf("Failed get time trigger list: %v", err)
} }
-115
View File
@@ -1,115 +0,0 @@
/*
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/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/pkg/apis/extensions/v1beta1"
)
// ensureTPR checks if the given TPR type exists, and creates it if
// needed. (Note that this creates the TPR type; it doesn't create any
// _instances_ of that type.)
func ensureTPR(clientset *kubernetes.Clientset, tpr *v1beta1.ThirdPartyResource) error {
_, err := clientset.Extensions().ThirdPartyResources().Get(tpr.ObjectMeta.Name, metav1.GetOptions{})
if err != nil {
if errors.IsNotFound(err) {
_, err := clientset.Extensions().ThirdPartyResources().Create(tpr)
if err != nil {
return err
}
}
}
return nil
}
func EnsureFissionTPRs(clientset *kubernetes.Clientset) error {
tprs := []v1beta1.ThirdPartyResource{
{
ObjectMeta: metav1.ObjectMeta{
Name: "function.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "Functions",
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "environment.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "Environments (function containers)",
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "httptrigger.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "HTTP triggers for functions",
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "kuberneteswatchtrigger.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "Kubernetes watch triggers for functions",
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "timetrigger.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "Time-based triggers for functions",
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "messagequeuetrigger.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "Message queue triggers for functions",
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "package.fission.io",
},
Versions: []v1beta1.APIVersion{
{Name: "v1"},
},
Description: "Packages: archives containing source or binaries for one or more functions",
},
}
for _, tpr := range tprs {
err := ensureTPR(clientset, &tpr)
if err != nil {
return err
}
}
return nil
}