123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /*
- Copyright 2017 The Kubernetes 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 storageos
- import (
- "fmt"
- "os"
- storageostypes "github.com/storageos/go-api/types"
- "k8s.io/api/core/v1"
- utiltesting "k8s.io/client-go/util/testing"
- "k8s.io/kubernetes/pkg/util/mount"
- "k8s.io/kubernetes/pkg/volume"
- volumetest "k8s.io/kubernetes/pkg/volume/testing"
- "testing"
- )
- var testAPISecretName = "storageos-api"
- var testVolName = "storageos-test-vol"
- var testPVName = "storageos-test-pv"
- var testNamespace = "storageos-test-namespace"
- var testSize = 1
- var testDesc = "testdescription"
- var testPool = "testpool"
- var testFSType = "ext2"
- var testVolUUID = "01c43d34-89f8-83d3-422b-43536a0f25e6"
- type fakeConfig struct {
- apiAddr string
- apiUser string
- apiPass string
- apiVersion string
- }
- func (c fakeConfig) GetAPIConfig() *storageosAPIConfig {
- return &storageosAPIConfig{
- apiAddr: "http://5.6.7.8:9999",
- apiUser: "abc",
- apiPass: "123",
- apiVersion: "10",
- }
- }
- func TestClient(t *testing.T) {
- util := storageosUtil{}
- cfg := fakeConfig{}
- err := util.NewAPI(cfg.GetAPIConfig())
- if err != nil {
- t.Fatalf("error getting api config: %v", err)
- }
- if util.api == nil {
- t.Errorf("client() unexpectedly returned nil")
- }
- }
- type fakeAPI struct{}
- func (f fakeAPI) Volume(namespace string, ref string) (*storageostypes.Volume, error) {
- if namespace == testNamespace && ref == testVolName {
- return &storageostypes.Volume{
- ID: "01c43d34-89f8-83d3-422b-43536a0f25e6",
- Name: ref,
- Pool: "default",
- Namespace: namespace,
- Size: 5,
- }, nil
- }
- return nil, fmt.Errorf("not found")
- }
- func (f fakeAPI) VolumeCreate(opts storageostypes.VolumeCreateOptions) (*storageostypes.Volume, error) {
- // Append a label from the api
- labels := opts.Labels
- labels["labelfromapi"] = "apilabel"
- return &storageostypes.Volume{
- ID: testVolUUID,
- Name: opts.Name,
- Namespace: opts.Namespace,
- Description: opts.Description,
- Pool: opts.Pool,
- Size: opts.Size,
- FSType: opts.FSType,
- Labels: labels,
- }, nil
- }
- func (f fakeAPI) VolumeMount(opts storageostypes.VolumeMountOptions) error {
- return nil
- }
- func (f fakeAPI) VolumeUnmount(opts storageostypes.VolumeUnmountOptions) error {
- return nil
- }
- func (f fakeAPI) VolumeDelete(opts storageostypes.DeleteOptions) error {
- return nil
- }
- func (f fakeAPI) Node(ref string) (*storageostypes.Node, error) {
- return &storageostypes.Node{}, nil
- }
- func TestCreateVolume(t *testing.T) {
- tmpDir, err := utiltesting.MkTmpdir("storageos_test")
- if err != nil {
- t.Fatalf("can't make a temp dir: %v", err)
- }
- defer os.RemoveAll(tmpDir)
- plugMgr := volume.VolumePluginMgr{}
- plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil))
- plug, _ := plugMgr.FindPluginByName("kubernetes.io/storageos")
- // Use real util with stubbed api
- util := &storageosUtil{}
- util.api = fakeAPI{}
- labels := map[string]string{
- "labelA": "valueA",
- "labelB": "valueB",
- }
- options := volume.VolumeOptions{
- PVName: testPVName,
- PVC: volumetest.CreateTestPVC(fmt.Sprintf("%dGi", testSize), []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}),
- PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimDelete,
- }
- provisioner := &storageosProvisioner{
- storageosMounter: &storageosMounter{
- storageos: &storageos{
- pvName: testPVName,
- volName: testVolName,
- volNamespace: testNamespace,
- sizeGB: testSize,
- pool: testPool,
- description: testDesc,
- fsType: testFSType,
- labels: labels,
- manager: util,
- plugin: plug.(*storageosPlugin),
- },
- },
- options: options,
- }
- vol, err := util.CreateVolume(provisioner)
- if err != nil {
- t.Errorf("CreateVolume() returned error: %v", err)
- }
- if vol == nil {
- t.Fatalf("CreateVolume() vol is empty")
- }
- if vol.ID == "" {
- t.Error("CreateVolume() vol ID is empty")
- }
- if vol.Name != testVolName {
- t.Errorf("CreateVolume() returned unexpected Name %s", vol.Name)
- }
- if vol.Namespace != testNamespace {
- t.Errorf("CreateVolume() returned unexpected Namespace %s", vol.Namespace)
- }
- if vol.Pool != testPool {
- t.Errorf("CreateVolume() returned unexpected Pool %s", vol.Pool)
- }
- if vol.FSType != testFSType {
- t.Errorf("CreateVolume() returned unexpected FSType %s", vol.FSType)
- }
- if vol.SizeGB != testSize {
- t.Errorf("CreateVolume() returned unexpected Size %d", vol.SizeGB)
- }
- if len(vol.Labels) == 0 {
- t.Error("CreateVolume() Labels are empty")
- } else {
- var val string
- var ok bool
- for k, v := range labels {
- if val, ok = vol.Labels[k]; !ok {
- t.Errorf("CreateVolume() Label %s not set", k)
- }
- if val != v {
- t.Errorf("CreateVolume() returned unexpected Label value %s", val)
- }
- }
- if val, ok = vol.Labels["labelfromapi"]; !ok {
- t.Error("CreateVolume() Label from api not set")
- }
- if val != "apilabel" {
- t.Errorf("CreateVolume() returned unexpected Label value %s", val)
- }
- }
- }
- func TestAttachVolume(t *testing.T) {
- tmpDir, err := utiltesting.MkTmpdir("storageos_test")
- if err != nil {
- t.Fatalf("can't make a temp dir: %v", err)
- }
- defer os.RemoveAll(tmpDir)
- plugMgr := volume.VolumePluginMgr{}
- plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil))
- plug, _ := plugMgr.FindPluginByName("kubernetes.io/storageos")
- // Use real util with stubbed api
- util := &storageosUtil{}
- util.api = fakeAPI{}
- mounter := &storageosMounter{
- storageos: &storageos{
- volName: testVolName,
- volNamespace: testNamespace,
- manager: util,
- mounter: &mount.FakeMounter{},
- plugin: plug.(*storageosPlugin),
- },
- deviceDir: tmpDir,
- }
- if err != nil {
- t.Errorf("Failed to make a new Mounter: %v", err)
- }
- if mounter == nil {
- t.Errorf("Got a nil Mounter")
- }
- }
|