Skip to content
This repository was archived by the owner on Dec 3, 2024. It is now read-only.

Commit 8d3c30e

Browse files
author
Rob Rati
committed
Added bucket controller
1 parent 02bb4f4 commit 8d3c30e

File tree

4 files changed

+712
-5
lines changed

4 files changed

+712
-5
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.15
55
require (
66
github.com/kubernetes-csi/csi-lib-utils v0.9.0
77
github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903
8-
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201217184109-8cbf84dde8d3
8+
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201210132056-afa665fb1e56
99
golang.org/x/net v0.0.0-20200707034311-ab3426394381
1010
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
1111
google.golang.org/grpc v1.34.0

go.sum

+30-4
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
5757
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
5858
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
5959
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
60-
github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4=
60+
github.com/container-object-storage-interface/api v0.0.0-20201102203747-fb97594fb7a4 h1:yGifSGm93DtEAJkXW+bn3NoGqrVy4uq0vWFT5CqtDqg=
61+
github.com/container-object-storage-interface/api v0.0.0-20201102203747-fb97594fb7a4/go.mod h1:AGSCVuBrCT8Jm9KlJdMfzHgYsEEyEYKgKQtd2KnTFJ4=
62+
github.com/container-object-storage-interface/spec v0.0.0-20200908192509-18912d8bf2a5 h1:KeXXrmLIz9uzVrr5u6lsidGPs8yfY7u5yMOhg6A+Tlk=
63+
github.com/container-object-storage-interface/spec v0.0.0-20200908192509-18912d8bf2a5/go.mod h1:vZ12rK3/PIcgz6w5ul9EibzgxcjT6rC+bZGkhxkDs0w=
6164
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
6265
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
6366
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
@@ -231,6 +234,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
231234
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
232235
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
233236
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
237+
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
234238
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
235239
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
236240
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -260,8 +264,10 @@ github.com/kubernetes-csi/csi-lib-utils v0.9.0 h1:TbuDmxoVqM+fvVkzG/7sShyX/8jUln
260264
github.com/kubernetes-csi/csi-lib-utils v0.9.0/go.mod h1:8E2jVUX9j3QgspwHXa6LwyN7IHQDjW9jX3kwoWnSC+M=
261265
github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903 h1:kBd9bCHv429J7Y8Mp2w1Xg3QtDiRAhittzYC/45/G2E=
262266
github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ=
263-
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201217184109-8cbf84dde8d3 h1:8uv9nGDukcMLYeg/m9YtTyr2IzXZd5WwUVDBRuJy2Vw=
264-
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201217184109-8cbf84dde8d3/go.mod h1:wojgWDesMMLuFza4p1YnpX3sdPeo0mDWmSbmPsxRDh0=
267+
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201208142312-59e00cb00687 h1:8M3yKR8iGDCVBIX811qYTwDonVU9vad/xHxVSk/vPzo=
268+
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201208142312-59e00cb00687/go.mod h1:wojgWDesMMLuFza4p1YnpX3sdPeo0mDWmSbmPsxRDh0=
269+
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201210132056-afa665fb1e56 h1:8sQxA61t/zPXwIjG5+6ZJXBerLkG6PDeBOrVsFGlzYw=
270+
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201210132056-afa665fb1e56/go.mod h1:wojgWDesMMLuFza4p1YnpX3sdPeo0mDWmSbmPsxRDh0=
265271
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
266272
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
267273
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -302,7 +308,7 @@ github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k
302308
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
303309
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
304310
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
305-
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
311+
github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
306312
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
307313
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
308314
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
@@ -599,21 +605,37 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
599605
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
600606
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
601607
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
608+
k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
609+
k8s.io/api v0.18.4/go.mod h1:lOIQAKYgai1+vz9J7YcDZwC26Z0zQewYOGWdyIPUUQ4=
602610
k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI=
603611
k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw=
604612
k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo=
605613
k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk=
614+
k8s.io/api v0.20.0 h1:WwrYoZNM1W1aQEbyl8HNG+oWGzLpZQBlcerS9BQw9yI=
615+
k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
606616
k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M=
617+
k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
618+
k8s.io/apimachinery v0.18.4/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
607619
k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
608620
k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
609621
k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0=
610622
k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
623+
k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8=
624+
k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
625+
k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
611626
k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg=
627+
k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
628+
k8s.io/client-go v0.18.4/go.mod h1:f5sXwL4yAZRkAtzOxRWUhA/N8XzGCb+nPZI8PfobZ9g=
612629
k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q=
613630
k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU=
614631
k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8=
615632
k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA=
633+
k8s.io/client-go v1.5.1 h1:XaX/lo2/u3/pmFau8HN+sB5C/b4dc4Dmm2eXjBH4p1E=
634+
k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o=
635+
k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
636+
k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
616637
k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
638+
k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
617639
k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14=
618640
k8s.io/component-base v0.19.0/go.mod h1:dKsY8BxkA+9dZIAh2aWJLL/UdASFDNtGYTCItL4LM7Y=
619641
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
@@ -626,6 +648,9 @@ k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
626648
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
627649
k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
628650
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
651+
k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ=
652+
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
653+
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
629654
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
630655
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
631656
k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488 h1:mNpvQf4lkIHNOXCoM+Veu/UXwA56Yx1J7hY1Tvcs/oM=
@@ -636,6 +661,7 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K
636661
k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
637662
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
638663
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
664+
sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo=
639665
sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE=
640666
sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY=
641667
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+200
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package bucket
18+
19+
import (
20+
"context"
21+
"fmt"
22+
"strings"
23+
"time"
24+
25+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
utilversion "k8s.io/apimachinery/pkg/util/version"
27+
28+
kubeclientset "k8s.io/client-go/kubernetes"
29+
"k8s.io/client-go/util/retry"
30+
"k8s.io/client-go/util/workqueue"
31+
32+
"github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1"
33+
bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset"
34+
"github.com/kubernetes-sigs/container-object-storage-interface-api/controller"
35+
36+
osspec "github.com/kubernetes-sigs/container-object-storage-interface-spec"
37+
38+
"k8s.io/klog"
39+
40+
"golang.org/x/time/rate"
41+
)
42+
43+
// bucketListener manages Bucket objects
44+
type bucketListener struct {
45+
kubeClient kubeclientset.Interface
46+
bucketClient bucketclientset.Interface
47+
provisionerClient osspec.ProvisionerClient
48+
49+
// The name of the provisioner for which this controller dynamically
50+
// provisions buckets.
51+
provisionerName string
52+
kubeVersion *utilversion.Version
53+
}
54+
55+
// NewBucketController returns a controller that manages Bucket objects
56+
func NewBucketController(provisionerName string, client osspec.ProvisionerClient) (*controller.ObjectStorageController, error) {
57+
rateLimit := workqueue.NewMaxOfRateLimiter(
58+
workqueue.NewItemExponentialFailureRateLimiter(5*time.Second, 60*time.Minute),
59+
&workqueue.BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
60+
)
61+
62+
identity := fmt.Sprintf("object-storage-sidecar-%s", provisionerName)
63+
bc, err := controller.NewObjectStorageController(identity, "bucket-controller", 5, rateLimit)
64+
if err != nil {
65+
return nil, err
66+
}
67+
68+
bl := bucketListener{
69+
provisionerName: provisionerName,
70+
provisionerClient: client,
71+
}
72+
bc.AddBucketListener(&bl)
73+
74+
return bc, nil
75+
}
76+
77+
// InitializeKubeClient initializes the kubernetes client
78+
func (bl *bucketListener) InitializeKubeClient(k kubeclientset.Interface) {
79+
bl.kubeClient = k
80+
81+
serverVersion, err := k.Discovery().ServerVersion()
82+
if err != nil {
83+
klog.Errorf("unable to get server version: %v", err)
84+
} else {
85+
bl.kubeVersion = utilversion.MustParseSemantic(serverVersion.GitVersion)
86+
}
87+
}
88+
89+
// InitializeBucketClient initializes the object storage bucket client
90+
func (bl *bucketListener) InitializeBucketClient(bc bucketclientset.Interface) {
91+
bl.bucketClient = bc
92+
}
93+
94+
// Add will call the provisioner and add a bucket
95+
func (bl *bucketListener) Add(ctx context.Context, obj *v1alpha1.Bucket) error {
96+
klog.V(1).Infof("bucketListener: add called for bucket %s", obj.Name)
97+
98+
// Verify this bucket is for this provisioner
99+
if !strings.EqualFold(obj.Spec.Provisioner, bl.provisionerName) {
100+
return nil
101+
}
102+
103+
req := osspec.ProvisionerCreateBucketRequest{
104+
BucketName: obj.Name,
105+
BucketContext: obj.Spec.Parameters,
106+
}
107+
108+
req.BucketContext["ProtocolVersion"] = obj.Spec.Protocol.Version
109+
110+
if obj.Spec.AnonymousAccessMode.Private {
111+
req.AnonymousBucketAccessMode = osspec.ProvisionerCreateBucketRequest_BUCKET_PRIVATE
112+
} else if obj.Spec.AnonymousAccessMode.PublicReadOnly {
113+
req.AnonymousBucketAccessMode = osspec.ProvisionerCreateBucketRequest_BUCKET_READ_ONLY
114+
} else if obj.Spec.AnonymousAccessMode.PublicReadWrite {
115+
req.AnonymousBucketAccessMode = osspec.ProvisionerCreateBucketRequest_BUCKET_WRITE_ONLY
116+
} else if obj.Spec.AnonymousAccessMode.PublicWriteOnly {
117+
req.AnonymousBucketAccessMode = osspec.ProvisionerCreateBucketRequest_BUCKET_READ_WRITE
118+
}
119+
120+
// TODO set grpc timeout
121+
rsp, err := bl.provisionerClient.ProvisionerCreateBucket(ctx, &req)
122+
if err != nil {
123+
klog.Errorf("error calling ProvisionerCreateBucket: %v", err)
124+
return err
125+
}
126+
klog.V(1).Infof("provisioner returned create bucket response %v", rsp)
127+
128+
// TODO update the bucket protocol in the bucket spec
129+
130+
// update bucket availability to true
131+
return bl.updateStatus(ctx, obj.Name, "Bucket Provisioned", true)
132+
}
133+
134+
// Update does nothing
135+
func (bl *bucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket) error {
136+
klog.V(1).Infof("bucketListener: update called for bucket %s", old.Name)
137+
return nil
138+
}
139+
140+
// Delete will call the provisioner and delete a bucket
141+
func (bl *bucketListener) Delete(ctx context.Context, obj *v1alpha1.Bucket) error {
142+
klog.V(1).Infof("bucketListener: delete called for bucket %s", obj.Name)
143+
144+
// Verify this bucket is for this provisioner
145+
if !strings.EqualFold(obj.Spec.Provisioner, bl.provisionerName) {
146+
return nil
147+
}
148+
149+
req := osspec.ProvisionerDeleteBucketRequest{
150+
BucketContext: obj.Spec.Parameters,
151+
}
152+
153+
switch obj.Spec.Protocol.Name {
154+
case v1alpha1.ProtocolNameS3:
155+
req.BucketName = obj.Spec.Protocol.S3.BucketName
156+
req.BucketContext["Region"] = obj.Spec.Protocol.S3.Region
157+
req.BucketContext["SignatureVersion"] = string(obj.Spec.Protocol.S3.SignatureVersion)
158+
req.BucketContext["Endpoint"] = obj.Spec.Protocol.S3.Endpoint
159+
case v1alpha1.ProtocolNameAzure:
160+
req.BucketName = obj.Spec.Protocol.AzureBlob.ContainerName
161+
req.BucketContext["StorageAccount"] = obj.Spec.Protocol.AzureBlob.StorageAccount
162+
case v1alpha1.ProtocolNameGCS:
163+
req.BucketName = obj.Spec.Protocol.GCS.BucketName
164+
req.BucketContext["ServiceAccount"] = obj.Spec.Protocol.GCS.ServiceAccount
165+
req.BucketContext["PrivateKeyName"] = obj.Spec.Protocol.GCS.PrivateKeyName
166+
req.BucketContext["ProjectID"] = obj.Spec.Protocol.GCS.ProjectID
167+
default:
168+
return fmt.Errorf("unknown protocol: %s", obj.Spec.Protocol.Name)
169+
}
170+
171+
req.BucketContext["ProtocolVersion"] = obj.Spec.Protocol.Version
172+
173+
// TODO set grpc timeout
174+
rsp, err := bl.provisionerClient.ProvisionerDeleteBucket(ctx, &req)
175+
if err != nil {
176+
klog.Errorf("error calling ProvisionerDeleteBucket: %v", err)
177+
obj.Status.Message = "Bucket Deleting"
178+
obj.Status.BucketAvailable = false
179+
_, err = bl.bucketClient.ObjectstorageV1alpha1().Buckets().UpdateStatus(ctx, obj, metav1.UpdateOptions{})
180+
return err
181+
}
182+
klog.V(1).Infof("provisioner returned delete bucket response %v", rsp)
183+
184+
// update bucket availability to false
185+
return bl.updateStatus(ctx, obj.Name, "Bucket Deleted", false)
186+
}
187+
188+
func (bl *bucketListener) updateStatus(ctx context.Context, name, msg string, state bool) error {
189+
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
190+
bucket, err := bl.bucketClient.ObjectstorageV1alpha1().Buckets().Get(ctx, name, metav1.GetOptions{})
191+
if err != nil {
192+
return err
193+
}
194+
bucket.Status.Message = msg
195+
bucket.Status.BucketAvailable = state
196+
_, err = bl.bucketClient.ObjectstorageV1alpha1().Buckets().UpdateStatus(ctx, bucket, metav1.UpdateOptions{})
197+
return err
198+
})
199+
return err
200+
}

0 commit comments

Comments
 (0)