Skip to content
This repository was archived by the owner on Jun 23, 2020. It is now read-only.

Commit 8fa9e37

Browse files
Refactored system unit tests
-Added unit test for mount target ocid specified -Rebased from master and refactored provisioner deployment
1 parent faf1247 commit 8fa9e37

35 files changed

+1308
-1088
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ env.sh
55
*.log
66
test/system/venv/
77
test/system/run-test-image.yaml*
8-
examples/*.yaml
8+
test/system/templates/*.yaml
9+
*.pyc
10+
.vscode/launch.json

Gopkg.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ ignored = ["k8s.io/client-go/pkg/api/v1"]
4848

4949
[[override]]
5050
name = "github.com/docker/distribution"
51-
revision = "f0cc927784781fa395c06317c58dea2841ece3a9" # Lock in to version 2.6.3 when it is released
51+
revision = "f0cc927784781fa395c06317c58dea2841ece3a9" # Lock in to version 2.6.3 when it is released
5252

5353
[[override]]
5454
name = "k8s.io/api"

cmd/main.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,21 @@ import (
2626
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/core"
2727
"github.com/oracle/oci-volume-provisioner/pkg/signals"
2828

29+
"k8s.io/apimachinery/pkg/api/resource"
2930
"k8s.io/client-go/informers"
3031
"k8s.io/client-go/kubernetes"
3132
"k8s.io/client-go/tools/clientcmd"
32-
33-
"k8s.io/apimachinery/pkg/api/resource"
3433
)
3534

3635
const (
3736
resyncPeriod = 15 * time.Second
3837
minResyncPeriod = 12 * time.Hour
39-
provisionerNameBlock = "oracle.com/oci"
40-
provisionerNameFss = "oracle.com/oci-fss"
4138
exponentialBackOffOnError = false
4239
failedRetryThreshold = 5
4340
leasePeriod = controller.DefaultLeaseDuration
4441
retryPeriod = controller.DefaultRetryPeriod
4542
renewDeadline = controller.DefaultRenewDeadline
4643
termLimit = controller.DefaultTermLimit
47-
provisionerTypeArg = "provisionerType"
4844
)
4945

5046
// informerResyncPeriod computes the time interval a shared informer waits
@@ -58,7 +54,7 @@ func informerResyncPeriod(minResyncPeriod time.Duration) func() time.Duration {
5854

5955
func main() {
6056
syscall.Umask(0)
61-
57+
rand.Seed(time.Now().Unix())
6258
kubeconfig := flag.String("kubeconfig", "", "Path to Kubeconfig file with authorization and master location information.")
6359
volumeRoundingEnabled := flag.Bool("rounding-enabled", true, "When enabled volumes will be rounded up if less than 'minVolumeSizeMB'")
6460
minVolumeSize := flag.String("min-volume-size", "50Gi", "The minimum size for a block volume. By default OCI only supports block volumes > 50GB")
@@ -97,7 +93,7 @@ func main() {
9793
// Decides what type of provider to deploy, either block or fss
9894
provisionerType := os.Getenv("PROVISIONER_TYPE")
9995
if provisionerType == "" {
100-
provisionerType = provisionerNameBlock
96+
provisionerType = core.ProvisionerNameBlock
10197
}
10298

10399
glog.Infof("Starting volume provisioner in %s mode", provisionerType)
@@ -111,8 +107,10 @@ func main() {
111107

112108
// Create the provisioner: it implements the Provisioner interface expected by
113109
// the controller
114-
ociProvisioner := core.NewOCIProvisioner(clientset, sharedInformerFactory.Core().V1().Nodes(), nodeName, *volumeRoundingEnabled, volumeSizeLowerBound)
115-
110+
ociProvisioner, err := core.NewOCIProvisioner(clientset, sharedInformerFactory.Core().V1().Nodes(), provisionerType, nodeName, *volumeRoundingEnabled, volumeSizeLowerBound)
111+
if err != nil {
112+
glog.Fatalf("Cannot create volume provisioner %v", err)
113+
}
116114
// Start the provision controller which will dynamically provision oci
117115
// PVs
118116
pc := controller.NewProvisionController(

examples/example-claim-fss.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ apiVersion: v1
33
metadata:
44
name: demooci
55
spec:
6-
storageClassName: "fss"
6+
storageClassName: "oci-fss"
77
selector:
88
matchLabels:
9-
oci-availability-domain: "PHX-AD-1"
9+
failure-domain.beta.kubernetes.io/zone: "PHX-AD-1"
1010
accessModes:
1111
- ReadWriteOnce
1212
resources:
1313
requests:
14-
storage: 50Gi
14+
storage: 50Gi

hack/check-golint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ set -o pipefail
2222

2323
TARGETS=$(for d in "$@"; do echo ./$d/...; done)
2424
echo -n "Checking golint: "
25-
ERRS=$(golint ${TARGETS} | grep -v mock_interfaces.go 2>&1 || true)
25+
ERRS=$(golint ${TARGETS} 2>&1 | grep -v mock_interfaces.go || true)
2626
if [ -n "${ERRS}" ]; then
2727
echo "FAIL"
2828
echo "${ERRS}"

pkg/oci/client/client.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ import (
2828
"time"
2929

3030
"github.com/golang/glog"
31-
"github.com/pkg/errors"
32-
3331
"github.com/oracle/oci-go-sdk/common"
3432
"github.com/oracle/oci-go-sdk/common/auth"
3533
"github.com/oracle/oci-go-sdk/core"
3634
"github.com/oracle/oci-go-sdk/filestorage"
3735
"github.com/oracle/oci-go-sdk/identity"
36+
"github.com/pkg/errors"
37+
3838
"github.com/oracle/oci-volume-provisioner/pkg/oci/instancemeta"
3939
)
4040

@@ -62,8 +62,8 @@ type Identity interface {
6262
ListAvailabilityDomains(ctx context.Context, request identity.ListAvailabilityDomainsRequest) (response identity.ListAvailabilityDomainsResponse, err error)
6363
}
6464

65-
// FileStorage specifies the subset of the OCI core API utilised by the provisioner.
66-
type FileStorage interface {
65+
// FSS specifies the subset of the OCI core API utilised by the provisioner.
66+
type FSS interface {
6767
CreateFileSystem(ctx context.Context, request filestorage.CreateFileSystemRequest) (response filestorage.CreateFileSystemResponse, err error)
6868
DeleteFileSystem(ctx context.Context, request filestorage.DeleteFileSystemRequest) (response filestorage.DeleteFileSystemResponse, err error)
6969
CreateMountTarget(ctx context.Context, request filestorage.CreateMountTargetRequest) (response filestorage.CreateMountTargetResponse, err error)
@@ -73,17 +73,17 @@ type FileStorage interface {
7373
ListMountTargets(ctx context.Context, request filestorage.ListMountTargetsRequest) (response filestorage.ListMountTargetsResponse, err error)
7474
}
7575

76-
//VirtualNetwork specifies the subset of the OCI core API utilised by the provisioner.
77-
type VirtualNetwork interface {
76+
//VCN specifies the subset of the OCI core API utilised by the provisioner.
77+
type VCN interface {
7878
GetPrivateIp(ctx context.Context, request core.GetPrivateIpRequest) (response core.GetPrivateIpResponse, err error)
7979
}
8080

8181
// ProvisionerClient is passed to all sub clients to provision a volume
8282
type ProvisionerClient interface {
8383
BlockStorage() BlockStorage
8484
Identity() Identity
85-
FileStorage() FileStorage
86-
VirtualNetwork() VirtualNetwork
85+
FSS() FSS
86+
VCN() VCN
8787
Context() context.Context
8888
Timeout() time.Duration
8989
CompartmentOCID() string
@@ -98,11 +98,11 @@ func (p *provisionerClient) Identity() Identity {
9898
return p.identity
9999
}
100100

101-
func (p *provisionerClient) FileStorage() FileStorage {
101+
func (p *provisionerClient) FSS() FSS {
102102
return p.fileStorage
103103
}
104104

105-
func (p *provisionerClient) VirtualNetwork() VirtualNetwork {
105+
func (p *provisionerClient) VCN() VCN {
106106
return p.virtualNetwork
107107
}
108108

pkg/provisioner/block/block_test.go

Lines changed: 11 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,18 @@
1515
package block
1616

1717
import (
18-
"context"
1918
"fmt"
2019
"testing"
2120
"time"
2221

23-
"github.com/oracle/oci-volume-provisioner/pkg/helpers"
24-
"github.com/oracle/oci-volume-provisioner/pkg/oci/client"
2522
"github.com/oracle/oci-volume-provisioner/pkg/oci/instancemeta"
23+
"github.com/oracle/oci-volume-provisioner/pkg/provisioner"
2624

2725
"github.com/kubernetes-incubator/external-storage/lib/controller"
2826
"github.com/oracle/oci-go-sdk/common"
2927
"github.com/oracle/oci-go-sdk/core"
3028
"github.com/oracle/oci-go-sdk/identity"
29+
3130
"k8s.io/api/core/v1"
3231
"k8s.io/apimachinery/pkg/api/resource"
3332
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -37,6 +36,9 @@ var (
3736
volumeBackupID = "dummyVolumeBackupId"
3837
defaultAD = identity.AvailabilityDomain{Name: common.String("PHX-AD-1"), CompartmentId: common.String("ocid1.compartment.oc1")}
3938
fileSystemID = "dummyFileSystemId"
39+
exportID = "dummyExportID"
40+
serverIPs = []string{"dummyServerIP"}
41+
privateIP = "127.0.0.1"
4042
)
4143

4244
func TestResolveFSTypeWhenNotConfigured(t *testing.T) {
@@ -57,73 +59,14 @@ func TestResolveFSTypeWhenConfigured(t *testing.T) {
5759
}
5860
}
5961

60-
type mockBlockStorageClient struct {
61-
volumeState core.VolumeLifecycleStateEnum
62-
}
63-
64-
func (c *mockBlockStorageClient) CreateVolume(ctx context.Context, request core.CreateVolumeRequest) (response core.CreateVolumeResponse, err error) {
65-
return core.CreateVolumeResponse{Volume: core.Volume{Id: common.String(volumeBackupID)}}, nil
66-
}
67-
68-
func (c *mockBlockStorageClient) DeleteVolume(ctx context.Context, request core.DeleteVolumeRequest) (response core.DeleteVolumeResponse, err error) {
69-
return core.DeleteVolumeResponse{}, nil
70-
}
71-
72-
func (c *mockBlockStorageClient) GetVolume(ctx context.Context, request core.GetVolumeRequest) (response core.GetVolumeResponse, err error) {
73-
return core.GetVolumeResponse{Volume: core.Volume{LifecycleState: c.volumeState}}, nil
74-
}
75-
76-
type mockIdentityClient struct {
77-
common.BaseClient
78-
}
79-
80-
func (client mockIdentityClient) ListAvailabilityDomains(ctx context.Context, request identity.ListAvailabilityDomainsRequest) (response identity.ListAvailabilityDomainsResponse, err error) {
81-
return
82-
}
83-
84-
type mockProvisionerClient struct {
85-
storage *mockBlockStorageClient
86-
}
87-
88-
func (p *mockProvisionerClient) BlockStorage() client.BlockStorage {
89-
return p.storage
90-
}
91-
92-
func (p *mockProvisionerClient) Identity() client.Identity {
93-
return &mockIdentityClient{}
94-
}
95-
96-
func (p *mockProvisionerClient) Context() context.Context {
97-
return context.Background()
98-
}
99-
100-
func (p *mockProvisionerClient) Timeout() time.Duration {
101-
return 30 * time.Second
102-
}
103-
104-
func (p *mockProvisionerClient) CompartmentOCID() (compartmentOCID string) {
105-
return ""
106-
}
107-
108-
func (p *mockProvisionerClient) TenancyOCID() string {
109-
return "ocid1.tenancy.oc1..aaaaaaaatyn7scrtwtqedvgrxgr2xunzeo6uanvyhzxqblctwkrpisvke4kq"
110-
}
111-
112-
// NewClientProvisioner creates an OCI client from the given configuration.
113-
func NewClientProvisioner(pcData client.ProvisionerClient,
114-
storage *mockBlockStorageClient,
115-
) client.ProvisionerClient {
116-
return &mockProvisionerClient{storage: storage}
117-
}
118-
11962
func TestCreateVolumeFromBackup(t *testing.T) {
12063
// test creating a volume from an existing backup
12164
options := controller.VolumeOptions{
12265
PVName: "dummyVolumeOptions",
12366
PVC: &v1.PersistentVolumeClaim{
12467
ObjectMeta: metav1.ObjectMeta{
12568
Annotations: map[string]string{
126-
ociVolumeBackupID: helpers.VolumeBackupID,
69+
ociVolumeBackupID: volumeBackupID,
12770
},
12871
},
12972
Spec: v1.PersistentVolumeClaimSpec{
@@ -137,7 +80,7 @@ func TestCreateVolumeFromBackup(t *testing.T) {
13780
}}
13881

13982
block := NewBlockProvisioner(
140-
NewClientProvisioner(nil, &mockBlockStorageClient{volumeState: core.VolumeLifecycleStateAvailable}),
83+
provisioner.NewClientProvisioner(nil, &provisioner.MockBlockStorageClient{VolumeState: core.VolumeLifecycleStateAvailable}),
14184
instancemeta.NewMock(&instancemeta.InstanceMetadata{
14285
CompartmentOCID: "",
14386
Region: "phx",
@@ -150,8 +93,8 @@ func TestCreateVolumeFromBackup(t *testing.T) {
15093
if err != nil {
15194
t.Fatalf("Failed to provision volume from block storage: %v", err)
15295
}
153-
if provisionedVolume.Annotations[ociVolumeID] != helpers.VolumeBackupID {
154-
t.Fatalf("Failed to assign the id of the blockID: %s, assigned %s instead", helpers.VolumeBackupID,
96+
if provisionedVolume.Annotations[ociVolumeID] != volumeBackupID {
97+
t.Fatalf("Failed to assign the id of the blockID: %s, assigned %s instead", volumeBackupID,
15598
provisionedVolume.Annotations[ociVolumeID])
15699
}
157100
}
@@ -183,7 +126,7 @@ func TestCreateVolumeFailure(t *testing.T) {
183126
},
184127
}}
185128

186-
block := NewBlockProvisioner(NewClientProvisioner(nil, &mockBlockStorageClient{volumeState: tt.state}),
129+
block := NewBlockProvisioner(provisioner.NewClientProvisioner(nil, &provisioner.MockBlockStorageClient{VolumeState: tt.state}),
187130
instancemeta.NewMock(&instancemeta.InstanceMetadata{
188131
CompartmentOCID: "",
189132
Region: "phx",
@@ -223,7 +166,7 @@ func TestVolumeRoundingLogic(t *testing.T) {
223166
CompartmentOCID: "",
224167
Region: "phx",
225168
})
226-
block := NewBlockProvisioner(NewClientProvisioner(nil, &mockBlockStorageClient{volumeState: core.VolumeLifecycleStateAvailable}),
169+
block := NewBlockProvisioner(provisioner.NewClientProvisioner(nil, &provisioner.MockBlockStorageClient{VolumeState: core.VolumeLifecycleStateAvailable}),
227170
metadata,
228171
tt.enabled,
229172
tt.minVolumeSize,

pkg/provisioner/core/provisioner.go

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
package core
1616

1717
import (
18-
"errors"
1918
"os"
2019
"strings"
2120
"time"
2221

2322
"github.com/golang/glog"
24-
2523
"github.com/kubernetes-incubator/external-storage/lib/controller"
24+
"github.com/pkg/errors"
25+
2626
"k8s.io/api/core/v1"
2727
"k8s.io/apimachinery/pkg/api/resource"
2828
informersv1 "k8s.io/client-go/informers/core/v1"
@@ -34,10 +34,17 @@ import (
3434
"github.com/oracle/oci-volume-provisioner/pkg/oci/client"
3535
"github.com/oracle/oci-volume-provisioner/pkg/oci/instancemeta"
3636
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/block"
37+
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/fss"
3738
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/plugin"
3839
)
3940

4041
const (
42+
// ProvisionerNameDefault is the name of the default OCI volume provisioner (block)
43+
ProvisionerNameDefault = "oracle.com/oci"
44+
// ProvisionerNameBlock is the name of the OCI block volume provisioner
45+
ProvisionerNameBlock = "oracle.com/oci-block"
46+
// ProvisionerNameFss is the name of the OCI FSS dedicated storage provisioner
47+
ProvisionerNameFss = "oracle.com/oci-fss"
4148
ociProvisionerIdentity = "ociProvisionerIdentity"
4249
ociAvailabilityDomain = "ociAvailabilityDomain"
4350
ociCompartment = "ociCompartment"
@@ -56,7 +63,7 @@ type OCIProvisioner struct {
5663
}
5764

5865
// NewOCIProvisioner creates a new OCI provisioner.
59-
func NewOCIProvisioner(kubeClient kubernetes.Interface, nodeInformer informersv1.NodeInformer, nodeName string, volumeRoundingEnabled bool, minVolumeSize resource.Quantity) *OCIProvisioner {
66+
func NewOCIProvisioner(kubeClient kubernetes.Interface, nodeInformer informersv1.NodeInformer, provisionerType string, nodeName string, volumeRoundingEnabled bool, minVolumeSize resource.Quantity) (*OCIProvisioner, error) {
6067
configPath, ok := os.LookupEnv("CONFIG_YAML_FILENAME")
6168
if !ok {
6269
configPath = configFilePath
@@ -77,19 +84,24 @@ func NewOCIProvisioner(kubeClient kubernetes.Interface, nodeInformer informersv1
7784
if err != nil {
7885
glog.Fatalf("Unable to create volume provisioner client: %v", err)
7986
}
80-
81-
blockProvisioner := block.NewBlockProvisioner(client, instancemeta.New(),
82-
volumeRoundingEnabled,
83-
minVolumeSize,
84-
time.Minute*3)
85-
87+
var provisioner plugin.ProvisionerPlugin
88+
switch provisionerType {
89+
case ProvisionerNameDefault:
90+
provisioner = block.NewBlockProvisioner(client, instancemeta.New(), volumeRoundingEnabled, minVolumeSize, time.Minute*3)
91+
case ProvisionerNameBlock:
92+
provisioner = block.NewBlockProvisioner(client, instancemeta.New(), volumeRoundingEnabled, minVolumeSize, time.Minute*3)
93+
case ProvisionerNameFss:
94+
provisioner = fss.NewFilesystemProvisioner(client)
95+
default:
96+
return nil, errors.Errorf("invalid provisioner type %q", provisionerType)
97+
}
8698
return &OCIProvisioner{
8799
client: client,
88100
kubeClient: kubeClient,
89101
nodeLister: nodeInformer.Lister(),
90102
nodeListerSynced: nodeInformer.Informer().HasSynced,
91-
provisioner: blockProvisioner,
92-
}
103+
provisioner: provisioner,
104+
}, nil
93105
}
94106

95107
var _ controller.Provisioner = &OCIProvisioner{}

0 commit comments

Comments
 (0)