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

Commit 05197cc

Browse files
authored
Add failure domain labels to created PVs (#101)
1 parent 4ec26f8 commit 05197cc

File tree

5 files changed

+41
-14
lines changed

5 files changed

+41
-14
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ DOCKER_REGISTRY_USERNAME ?= oracle
3030
IMAGE ?= $(REGISTRY)/$(DOCKER_REGISTRY_TENANCY)/$(BIN)
3131
TEST_IMAGE ?= $(REGISTRY)/$(DOCKER_REGISTRY_TENANCY)/$(BIN)-test
3232

33+
OCI_SHORT_REGION ?= iad
34+
3335
GOOS ?= linux
3436
GOARCH ?= amd64
3537
SRC_DIRS := cmd pkg # directories which hold app source (not vendored)
@@ -116,6 +118,6 @@ version:
116118

117119
.PHONY: run-dev
118120
run-dev: build
119-
NODE_NAME=localhost ./dist/oci-volume-provisioner \
121+
NODE_NAME=localhost OCI_VOLUME_PROVISIONER_REGION=$(OCI_SHORT_REGION) ./dist/oci-volume-provisioner \
120122
--kubeconfig=${KUBECONFIG} \
121123
-v=4

pkg/provisioner/block/block.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232
"github.com/oracle/oci-go-sdk/identity"
3333
"github.com/oracle/oci-volume-provisioner/pkg/oci/client"
3434
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/plugin"
35+
36+
"github.com/oracle/oci-volume-provisioner/pkg/oci/instancemeta"
3537
)
3638

3739
const (
@@ -43,15 +45,17 @@ const (
4345

4446
// blockProvisioner is the internal provisioner for OCI block volumes
4547
type blockProvisioner struct {
46-
client client.ProvisionerClient
48+
client client.ProvisionerClient
49+
metadata instancemeta.Interface
4750
}
4851

4952
var _ plugin.ProvisionerPlugin = &blockProvisioner{}
5053

5154
// NewBlockProvisioner creates a new instance of the block storage provisioner
52-
func NewBlockProvisioner(client client.ProvisionerClient) plugin.ProvisionerPlugin {
55+
func NewBlockProvisioner(client client.ProvisionerClient, metadata instancemeta.Interface) plugin.ProvisionerPlugin {
5356
return &blockProvisioner{
54-
client: client,
57+
client: client,
58+
metadata: metadata,
5559
}
5660
}
5761

@@ -72,13 +76,10 @@ func roundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 {
7276
}
7377

7478
// Provision creates an OCI block volume acording to the spec
75-
func (block *blockProvisioner) Provision(options controller.VolumeOptions,
76-
availabilityDomain *identity.AvailabilityDomain) (*v1.PersistentVolume, error) {
79+
func (block *blockProvisioner) Provision(options controller.VolumeOptions, ad *identity.AvailabilityDomain) (*v1.PersistentVolume, error) {
7780
for _, accessMode := range options.PVC.Spec.AccessModes {
7881
if accessMode != v1.ReadWriteOnce {
79-
return nil, fmt.Errorf("invalid access mode %v specified. Only %v is supported",
80-
accessMode,
81-
v1.ReadWriteOnce)
82+
return nil, fmt.Errorf("invalid access mode %q specified (only %q is supported)", accessMode, v1.ReadWriteOnce)
8283
}
8384
}
8485

@@ -88,10 +89,10 @@ func (block *blockProvisioner) Provision(options controller.VolumeOptions,
8889
glog.Infof("Volume size (bytes): %v", volSizeBytes)
8990
volSizeMB := int(roundUpSize(volSizeBytes, 1024*1024))
9091

91-
glog.Infof("Creating volume size=%v AD=%s compartmentOCID=%q", volSizeMB, *availabilityDomain.Name, block.client.CompartmentOCID())
92+
glog.Infof("Creating volume size=%v AD=%s compartmentOCID=%q", volSizeMB, *ad.Name, block.client.CompartmentOCID())
9293

9394
volumeDetails := core.CreateVolumeDetails{
94-
AvailabilityDomain: availabilityDomain.Name,
95+
AvailabilityDomain: ad.Name,
9596
CompartmentId: common.String(block.client.CompartmentOCID()),
9697
DisplayName: common.String(fmt.Sprintf("%s%s", os.Getenv(volumePrefixEnvVarName), options.PVC.Name)),
9798
SizeInMBs: common.Int(volSizeMB),
@@ -119,13 +120,25 @@ func (block *blockProvisioner) Provision(options controller.VolumeOptions,
119120
//volumeName := mapVolumeIDToName(*newVolume.Id)
120121
filesystemType := resolveFSType(options)
121122

123+
region, ok := os.LookupEnv("OCI_SHORT_REGION")
124+
if !ok {
125+
metadata, err := block.metadata.Get()
126+
if err != nil {
127+
return nil, err
128+
}
129+
region = metadata.Region
130+
}
131+
122132
pv := &v1.PersistentVolume{
123133
ObjectMeta: metav1.ObjectMeta{
124134
Name: *newVolume.Id,
125135
Annotations: map[string]string{
126136
ociVolumeID: *newVolume.Id,
127137
},
128-
Labels: map[string]string{},
138+
Labels: map[string]string{
139+
plugin.LabelZoneRegion: region,
140+
plugin.LabelZoneFailureDomain: *ad.Name,
141+
},
129142
},
130143
Spec: v1.PersistentVolumeSpec{
131144
PersistentVolumeReclaimPolicy: options.PersistentVolumeReclaimPolicy,

pkg/provisioner/block/block_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"time"
2121

2222
"github.com/oracle/oci-volume-provisioner/pkg/oci/client"
23+
"github.com/oracle/oci-volume-provisioner/pkg/oci/instancemeta"
2324

2425
"github.com/kubernetes-incubator/external-storage/lib/controller"
2526
"github.com/oracle/oci-go-sdk/common"
@@ -113,7 +114,12 @@ func TestCreateVolumeFromBackup(t *testing.T) {
113114
},
114115
}}
115116
ad := identity.AvailabilityDomain{Name: common.String("dummyAdName"), CompartmentId: common.String("dummyCompartmentId")}
116-
block := blockProvisioner{client: NewClientProvisioner(nil)}
117+
block := blockProvisioner{
118+
client: NewClientProvisioner(nil),
119+
metadata: instancemeta.NewMock(&instancemeta.InstanceMetadata{
120+
CompartmentOCID: "",
121+
Region: "phx",
122+
})}
117123
provisionedVolume, err := block.Provision(options, &ad)
118124
if err != nil {
119125
t.Fatalf("Failed to provision volume from block storage: %v", err)

pkg/provisioner/core/provisioner.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/client-go/tools/cache"
3232

3333
"github.com/oracle/oci-volume-provisioner/pkg/oci/client"
34+
"github.com/oracle/oci-volume-provisioner/pkg/oci/instancemeta"
3435
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/block"
3536
"github.com/oracle/oci-volume-provisioner/pkg/provisioner/plugin"
3637
)
@@ -77,7 +78,7 @@ func NewOCIProvisioner(kubeClient kubernetes.Interface, nodeInformer informersv1
7778
glog.Fatalf("Unable to create volume provisioner client: %v", err)
7879
}
7980

80-
blockProvisioner := block.NewBlockProvisioner(client)
81+
blockProvisioner := block.NewBlockProvisioner(client, instancemeta.New())
8182

8283
return &OCIProvisioner{
8384
client: client,

pkg/provisioner/plugin/plugin.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ import (
2323
const (
2424
// OCIProvisionerName is the name of the provisioner defined in the storage class definitions
2525
OCIProvisionerName = "oracle/oci"
26+
27+
// LabelZoneFailureDomain the availability domain in which the PD resides.
28+
LabelZoneFailureDomain = "failure-domain.beta.kubernetes.io/zone"
29+
// LabelZoneRegion the region in which the PD resides.
30+
LabelZoneRegion = "failure-domain.beta.kubernetes.io/region"
2631
)
2732

2833
// ProvisionerPlugin implements the controller plugin plus some extras that are common

0 commit comments

Comments
 (0)