diff --git a/controller/environmentStore.go b/controller/environmentStore.go new file mode 100644 index 00000000..49bd8efa --- /dev/null +++ b/controller/environmentStore.go @@ -0,0 +1,79 @@ +/* +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 controller + +import ( + "github.com/satori/go.uuid" + + "github.com/platform9/fission" +) + +type EnvironmentStore struct { + resourceStore +} + +func (es *EnvironmentStore) create(e *fission.Environment) error { + e.Metadata.Uid = uuid.NewV4().String() + return es.resourceStore.create(e) +} + +func (es *EnvironmentStore) read(m fission.Metadata) (*fission.Environment, error) { + var e fission.Environment + err := es.resourceStore.read(m.Name, &e) + if err != nil { + return nil, err + } + return &e, nil +} + +func (es *EnvironmentStore) update(e *fission.Environment) error { + e.Metadata.Uid = uuid.NewV4().String() + return es.resourceStore.update(e) +} + +func (es *EnvironmentStore) delete(m fission.Metadata) error { + typeName, err := getTypeName(fission.Environment{}) + if err != nil { + return err + } + return es.resourceStore.delete(typeName, m.Name) +} + +func (es *EnvironmentStore) list() ([]fission.Environment, error) { + typeName, err := getTypeName(fission.Environment{}) + if err != nil { + return nil, err + } + + bufs, err := es.resourceStore.getAll(typeName) + if err != nil { + return nil, err + } + + triggers := make([]fission.Environment, 0, len(bufs)) + js := JsonSerializer{} + for _, buf := range bufs { + var e fission.Environment + err = js.deserialize([]byte(buf), &e) + if err != nil { + return nil, err + } + triggers = append(triggers, e) + } + + return triggers, nil +} diff --git a/controller/functionStore.go b/controller/functionStore.go new file mode 100644 index 00000000..a5bc6406 --- /dev/null +++ b/controller/functionStore.go @@ -0,0 +1,137 @@ +/* +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 controller + +import ( + log "github.com/Sirupsen/logrus" + + "github.com/platform9/fission" +) + +type FunctionStore struct { + resourceStore +} + +func (fs *FunctionStore) Create(f *fission.Function) (string, error) { + code := []byte(f.Code) + _, uid, err := fs.resourceStore.writeFile(f.Key(), code) + if err != nil { + return "", err + } + + f.Metadata.Uid = uid + f.Code = "" + + err = fs.resourceStore.create(f) + if err != nil { + fs.resourceStore.deleteFile(f.Key(), uid) // ignore errors + return "", err + } + return f.Metadata.Uid, nil +} + +func (fs *FunctionStore) Get(m *fission.Metadata) (*fission.Function, error) { + var f fission.Function + err := fs.resourceStore.read(m.Name, &f) + if err != nil { + return nil, err + } + + var code []byte + if len(m.Uid) > 0 { + log.WithFields(log.Fields{"Uid": m.Uid}).Info("fetching by uid") + code, err = fs.resourceStore.readFile(m.Name, &m.Uid) + f.Metadata = *m + } else { + code, err = fs.resourceStore.readFile(m.Name, nil) + } + if err != nil { + return nil, err + } + + f.Code = string(code) + return &f, nil +} + +func (fs *FunctionStore) Update(f *fission.Function) (string, error) { + code := []byte(f.Code) + _, uid, err := fs.resourceStore.writeFile(f.Key(), code) + if err != nil { + return "", err + } + + var fnew fission.Function + err = fs.resourceStore.read(f.Metadata.Name, &fnew) + if err != nil { + fs.resourceStore.deleteFile(f.Key(), uid) // ignore err + return "", err + } + + fnew.Metadata.Uid = uid + fnew.Environment = f.Environment + + err = fs.resourceStore.update(fnew) + if err != nil { + fs.resourceStore.deleteFile(f.Key(), uid) // ignore err + return "", err + } + return uid, err +} + +func (fs *FunctionStore) Delete(m fission.Metadata) error { + if len(m.Uid) == 0 { + err := fs.resourceStore.deleteAllFiles(m.Name) + if err != nil { + return err + } + } else { + err := fs.resourceStore.deleteFile(m.Name, m.Uid) + if err != nil { + return err + } + } + typeName, err := getTypeName(fission.Function{}) + if err != nil { + return err + } + return fs.resourceStore.delete(typeName, m.Name) +} + +func (fs *FunctionStore) List() ([]fission.Function, error) { + typeName, err := getTypeName(fission.Function{}) + if err != nil { + return nil, err + } + + bufs, err := fs.resourceStore.getAll(typeName) + if err != nil { + return nil, err + } + + js := JsonSerializer{} + functions := make([]fission.Function, 0, len(bufs)) + for _, buf := range bufs { + var f fission.Function + err = js.deserialize([]byte(buf), &f) + if err != nil { + return nil, err + } + functions = append(functions, f) + } + + return functions, nil +} diff --git a/controller/httpTriggerStore.go b/controller/httpTriggerStore.go new file mode 100644 index 00000000..e2d42e5a --- /dev/null +++ b/controller/httpTriggerStore.go @@ -0,0 +1,83 @@ +/* +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 controller + +import ( + "github.com/satori/go.uuid" + + "github.com/platform9/fission" +) + +type HTTPTriggerStore struct { + resourceStore +} + +func (hts *HTTPTriggerStore) create(ht *fission.HTTPTrigger) error { + ht.Metadata.Uid = uuid.NewV4().String() + return hts.resourceStore.create(ht) +} + +func (hts *HTTPTriggerStore) read(m fission.Metadata) (*fission.HTTPTrigger, error) { + var ht fission.HTTPTrigger + err := hts.resourceStore.read(m.Name, &ht) + if err != nil { + return nil, err + } + return &ht, nil +} + +func (hts *HTTPTriggerStore) update(ht *fission.HTTPTrigger) error { + err := validateHTTPTrigger(ht) + if err != nil { + return err + } + ht.Metadata.Uid = uuid.NewV4().String() + return hts.resourceStore.update(ht) +} + +func (hts *HTTPTriggerStore) delete(m fission.Metadata) error { + typeName, err := getTypeName(fission.HTTPTrigger{}) + if err != nil { + return err + } + return hts.resourceStore.delete(typeName, m.Name) +} + +func (hts *HTTPTriggerStore) list() ([]fission.HTTPTrigger, error) { + typeName, err := getTypeName(fission.HTTPTrigger{}) + if err != nil { + return nil, err + } + + bufs, err := hts.resourceStore.getAll(typeName) + if err != nil { + return nil, err + } + + triggers := make([]fission.HTTPTrigger, 0, len(bufs)) + js := JsonSerializer{} + for _, buf := range bufs { + var ht fission.HTTPTrigger + err = js.deserialize([]byte(buf), &ht) + if err != nil { + return nil, err + } + triggers = append(triggers, ht) + } + + return triggers, nil +}