diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go new file mode 100644 index 000000000..d5e2cf91b --- /dev/null +++ b/pkg/storage/storage.go @@ -0,0 +1,48 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +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 storage // import "k8s.io/helm/pkg/storage" + +import ( + "k8s.io/helm/pkg/storage/driver" + rspb "k8s.io/helm/pkg/proto/hapi/release" +) + +type Storage struct { + drv driver.Driver +} + +func (st *Storage) StoreRelease(rls *rspb.Release) error { + return st.drv.Create(rls) +} + +func (st *Storage) UpdateRelease(rls *rspb.Release) error { + return st.drv.Update(rls) +} + +func (st *Storage) QueryRelease(key string) (*rspb.Release, error) { + return st.drv.Get(key) +} + +func (st *Storage) DeleteRelease(key string) (*rspb.Release, error) { + return st.drv.Delete(key) +} + +func Init(drv driver.Driver) *Storage { + if drv == nil { + drv = driver.NewMemory() + } + return &Storage{drv: drv} +} \ No newline at end of file diff --git a/pkg/storage/storage_test.go b/pkg/storage/storage_test.go new file mode 100644 index 000000000..691ffdd5e --- /dev/null +++ b/pkg/storage/storage_test.go @@ -0,0 +1,141 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +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 storage // import "k8s.io/helm/pkg/storage" + +import ( + "fmt" + "time" + "reflect" + "testing" + + "k8s.io/helm/pkg/storage/driver" + rspb "k8s.io/helm/pkg/proto/hapi/release" + + tspb "github.com/golang/protobuf/ptypes" +) + +var storage = Init(driver.NewMemory()) + +func releaseData() *rspb.Release { + var manifest = `apiVersion: v1 + kind: ConfigMap + metadata: + name: configmap-storage-test + data: + count: "100" + limit: "200" + state: "new" + token: "abc" + ` + + tm, _ := tspb.TimestampProto(time.Now()) + return &rspb.Release{ + Name: "hungry-hippo", + Info: &rspb.Info{ + FirstDeployed: tm, + LastDeployed: tm, + Status: &rspb.Status{Code: rspb.Status_DEPLOYED}, + }, + Version: 2, + Manifest: manifest, + Namespace: "kube-system", + } +} + +func TestStoreRelease(t *testing.T) { + ckerr := func(err error, msg string) { + if err != nil { + t.Fatalf(fmt.Sprintf("Failed to %s: %q", msg, err)) + } + } + + rls := releaseData() + ckerr(storage.StoreRelease(rls), "StoreRelease") + + res, err := storage.QueryRelease(rls.Name) + ckerr(err, "QueryRelease") + + if !reflect.DeepEqual(rls, res) { + t.Fatalf("Expected %q, got %q", rls, res) + } +} + +func TestQueryRelease(t *testing.T) { + ckerr := func(err error, msg string) { + if err != nil { + t.Fatalf(fmt.Sprintf("Failed to %s: %q", msg, err)) + } + } + + rls := releaseData() + ckerr(storage.StoreRelease(rls), "StoreRelease") + + res, err := storage.QueryRelease(rls.Name) + ckerr(err, "QueryRelease") + + if !reflect.DeepEqual(rls, res) { + t.Fatalf("Expected %q, got %q", rls, res) + } +} + +func TestDeleteRelease(t *testing.T) { + ckerr := func(err error, msg string) { + if err != nil { + t.Fatalf(fmt.Sprintf("Failed to %s: %q", msg, err)) + } + } + + rls := releaseData() + ckerr(storage.StoreRelease(rls), "StoreRelease") + + res, err := storage.DeleteRelease(rls.Name) + ckerr(err, "DeleteRelease") + + if !reflect.DeepEqual(rls, res) { + t.Fatalf("Expected %q, got %q", rls, res) + } +} + +func TestUpdateRelease(t *testing.T) { + ckeql := func(got, want interface{}, msg string) { + if !reflect.DeepEqual(got, want) { + t.Fatalf(fmt.Sprintf("%s: got %T, want %T", msg, got, want)) + } + } + + ckerr := func(err error, msg string) { + if err != nil { + t.Fatalf(fmt.Sprintf("Failed to %s: %q", msg, err)) + } + } + + rls := releaseData() + ckerr(storage.StoreRelease(rls), "StoreRelease") + + rls.Name = "hungry-hippo" + rls.Version = 2 + rls.Manifest = "old-manifest" + + err := storage.UpdateRelease(rls) + ckerr(err, "UpdateRelease") + + res, err := storage.QueryRelease(rls.Name) + ckerr(err, "QueryRelease") + ckeql(res, rls, "Expected Release") + ckeql(res.Name, rls.Name, "Expected Name") + ckeql(res.Version, rls.Version, "Expected Version") + ckeql(res.Manifest, rls.Manifest, "Expected Manifest") +} \ No newline at end of file