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

Commit 2dd48d6

Browse files
authored
Merge pull request #27 from wlan0/master
Add sample driver
2 parents c36b85b + f99bf37 commit 2dd48d6

File tree

9 files changed

+719
-14
lines changed

9 files changed

+719
-14
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FROM gcr.io/distroless/static:latest
2+
LABEL maintainers="Kubernetes Authors"
3+
LABEL description="Object Storage Sidecar Sample Driver"
4+
5+
COPY ./bin/sample-driver /sample-driver
6+
ENTRYPOINT ["/sample-driver"]

Diff for: container-object-storage-interface-provisioner-sidecar/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
CMDS=objectstorage-sidecar
15+
CMDS=objectstorage-sidecar sample-driver
1616

1717
all: reltools build
1818
.PHONY: reltools

Diff for: container-object-storage-interface-provisioner-sidecar/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ COSI repos and images:
44
[API](https://github.com/kubernetes-sigs/container-object-storage-interface-api) \
55
[Controller](https://github.com/kubernetes-sigs/container-object-storage-interface-controller) <br/>
66
&emsp; - [images: cosi-controller](https://quay.io/repository/containerobjectstorage/objectstorage-controller?tab=tags) \
7-
[Provisioner Sidecar](https://github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar) <br />
7+
[Provisioner Sidecar](https://sigs.k8s.io/container-object-storage-interface-provisioner-sidecar) <br />
88
&emsp; - images: cosi-provisioner \
99
[CSI Adapter](https://github.com/kubernetes-sigs/container-object-storage-interface-csi-adapter) <br />
1010
&emsp; - images: cosi-node-adapter

Diff for: container-object-storage-interface-provisioner-sidecar/cmd/objectstorage-sidecar/app/objectstorage-sidecar.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import (
55
"os"
66
"time"
77

8-
"github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar/pkg/controller/bucket"
9-
"github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar/pkg/controller/bucketaccess"
10-
"github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar/pkg/grpcclient"
8+
"sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/pkg/controller/bucket"
9+
"sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/pkg/controller/bucketaccess"
10+
"sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/pkg/grpcclient"
1111

1212
osspec "github.com/kubernetes-sigs/container-object-storage-interface-spec"
1313

Diff for: container-object-storage-interface-provisioner-sidecar/cmd/objectstorage-sidecar/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package main
1919
import (
2020
"os"
2121

22-
"github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar/cmd/objectstorage-sidecar/app"
22+
"sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/cmd/objectstorage-sidecar/app"
2323
)
2424

2525
func main() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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 main
18+
19+
import (
20+
"fmt"
21+
22+
"github.com/minio/minio-go"
23+
"github.com/minio/minio/pkg/auth"
24+
"github.com/minio/minio/pkg/bucket/policy"
25+
"github.com/minio/minio/pkg/bucket/policy/condition"
26+
iampolicy "github.com/minio/minio/pkg/iam/policy"
27+
"github.com/minio/minio/pkg/madmin"
28+
29+
"golang.org/x/net/context"
30+
"google.golang.org/grpc/codes"
31+
"google.golang.org/grpc/status"
32+
"k8s.io/klog"
33+
34+
cosi "github.com/kubernetes-sigs/container-object-storage-interface-spec"
35+
)
36+
37+
var (
38+
PROVISIONER_NAME = "sample-provisioner.objectstorage.k8s.io"
39+
VERSION = "dev"
40+
)
41+
42+
type DriverServer struct {
43+
Name, Version string
44+
S3Client *minio.Client
45+
S3AdminClient *madmin.AdminClient
46+
}
47+
48+
func (ds *DriverServer) ProvisionerGetInfo(context.Context, *cosi.ProvisionerGetInfoRequest) (*cosi.ProvisionerGetInfoResponse, error) {
49+
rsp := &cosi.ProvisionerGetInfoResponse{}
50+
rsp.Name = fmt.Sprintf("%s-%s", ds.Name, ds.Version)
51+
return rsp, nil
52+
}
53+
54+
func (ds DriverServer) ProvisionerCreateBucket(ctx context.Context, req *cosi.ProvisionerCreateBucketRequest) (*cosi.ProvisionerCreateBucketResponse, error) {
55+
klog.Infof("Using minio to create Backend Bucket")
56+
57+
if ds.Name == "" {
58+
return nil, status.Error(codes.Unavailable, "Driver name not configured")
59+
}
60+
61+
if ds.Version == "" {
62+
return nil, status.Error(codes.Unavailable, "Driver is missing version")
63+
}
64+
65+
err := ds.S3Client.MakeBucket(req.BucketName, "")
66+
if err != nil {
67+
// Check to see if the bucket already exists
68+
exists, errBucketExists := ds.S3Client.BucketExists(req.BucketName)
69+
if errBucketExists == nil && exists {
70+
klog.Info("Backend Bucket already exists", req.BucketName)
71+
return &cosi.ProvisionerCreateBucketResponse{}, nil
72+
} else {
73+
klog.Error(err)
74+
return &cosi.ProvisionerCreateBucketResponse{}, err
75+
}
76+
}
77+
klog.Info("Successfully created Backend Bucket", req.BucketName)
78+
79+
return &cosi.ProvisionerCreateBucketResponse{}, nil
80+
}
81+
82+
func (ds *DriverServer) ProvisionerDeleteBucket(ctx context.Context, req *cosi.ProvisionerDeleteBucketRequest) (*cosi.ProvisionerDeleteBucketResponse, error) {
83+
84+
if err := ds.S3Client.RemoveBucket(req.BucketName); err != nil {
85+
klog.Info("failed to delete bucket", req.BucketName)
86+
return nil, err
87+
88+
}
89+
return &cosi.ProvisionerDeleteBucketResponse{}, nil
90+
}
91+
92+
func (ds *DriverServer) ProvisionerGrantBucketAccess(ctx context.Context, req *cosi.ProvisionerGrantBucketAccessRequest) (*cosi.ProvisionerGrantBucketAccessResponse, error) {
93+
94+
creds, err := auth.GetNewCredentials()
95+
if err != nil {
96+
klog.Error("failed to generate new credentails")
97+
return nil, err
98+
}
99+
100+
if err := ds.S3AdminClient.AddUser(context.Background(), creds.AccessKey, creds.SecretKey); err != nil {
101+
klog.Error("failed to create user", err)
102+
return nil, err
103+
}
104+
105+
// Create policy
106+
p := iampolicy.Policy{
107+
Version: iampolicy.DefaultVersion,
108+
Statements: []iampolicy.Statement{
109+
iampolicy.NewStatement(
110+
policy.Allow,
111+
iampolicy.NewActionSet("s3:*"),
112+
iampolicy.NewResourceSet(iampolicy.NewResource(req.GetBucketName()+"/*", "")),
113+
condition.NewFunctions(),
114+
)},
115+
}
116+
117+
if err := ds.S3AdminClient.AddCannedPolicy(context.Background(), "s3:*", &p); err != nil {
118+
klog.Error("failed to add canned policy", err)
119+
return nil, err
120+
}
121+
122+
if err := ds.S3AdminClient.SetPolicy(context.Background(), "s3:*", creds.AccessKey, false); err != nil {
123+
klog.Error("failed to set policy", err)
124+
return nil, err
125+
}
126+
127+
return &cosi.ProvisionerGrantBucketAccessResponse{
128+
Principal: req.Principal,
129+
CredentialsFileContents: fmt.Sprintf("[default]\naws_access_key %s\naws_secret_key %s", creds.AccessKey, creds.SecretKey),
130+
CredentialsFilePath: ".aws/credentials",
131+
}, nil
132+
}
133+
134+
func (ds *DriverServer) ProvisionerRevokeBucketAccess(ctx context.Context, req *cosi.ProvisionerRevokeBucketAccessRequest) (*cosi.ProvisionerRevokeBucketAccessResponse, error) {
135+
136+
// revokes user access to bucket
137+
if err := ds.S3AdminClient.RemoveUser(ctx, req.GetPrincipal()); err != nil {
138+
klog.Error("falied to Revoke Bucket Access")
139+
return nil, err
140+
}
141+
return &cosi.ProvisionerRevokeBucketAccessResponse{}, nil
142+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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 main
18+
19+
import (
20+
"context"
21+
"flag"
22+
"fmt"
23+
"os"
24+
"os/signal"
25+
"strings"
26+
"syscall"
27+
28+
"github.com/minio/minio-go"
29+
"github.com/minio/minio/pkg/madmin"
30+
"github.com/spf13/cobra"
31+
"github.com/spf13/viper"
32+
"k8s.io/klog"
33+
34+
"sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/pkg/grpcserver"
35+
)
36+
37+
var (
38+
cosiAddress = "tcp://0.0.0.0:9000"
39+
s3Endpoint = "tcp://0.0.0.0:9000"
40+
accessKey = "AKIAIOSFODNN7EXAMPLE"
41+
secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
42+
ctx context.Context
43+
)
44+
45+
var cmd = &cobra.Command{
46+
Use: os.Args[0],
47+
Short: "sample provisoner for provisioning bucket instance to the backend bucket",
48+
SilenceErrors: true,
49+
SilenceUsage: true,
50+
RunE: func(c *cobra.Command, args []string) error {
51+
return run(args, cosiAddress)
52+
},
53+
DisableFlagsInUseLine: true,
54+
Version: VERSION,
55+
}
56+
57+
func init() {
58+
viper.AutomaticEnv()
59+
60+
cmd.PersistentFlags().AddGoFlagSet(flag.CommandLine)
61+
flag.Set("logtostderr", "true")
62+
63+
strFlag := func(c *cobra.Command, ptr *string, name string, short string, dfault string, desc string) {
64+
c.PersistentFlags().
65+
StringVarP(ptr, name, short, dfault, desc)
66+
}
67+
strFlag(cmd, &cosiAddress, "listen-address", "", cosiAddress, "The address for the driver to listen on")
68+
strFlag(cmd, &s3Endpoint, "s3-endpoint", "", "", "S3-endpont")
69+
strFlag(cmd, &accessKey, "access-key", "", "", "S3-AccessKey")
70+
strFlag(cmd, &secretKey, "secret-key", "", "", "S3-SecretKey")
71+
hideFlag := func(name string) {
72+
cmd.PersistentFlags().MarkHidden(name)
73+
}
74+
hideFlag("alsologtostderr")
75+
hideFlag("log_backtrace_at")
76+
hideFlag("log_dir")
77+
hideFlag("logtostderr")
78+
hideFlag("master")
79+
hideFlag("stderrthreshold")
80+
hideFlag("vmodule")
81+
82+
// Substitute _ for -
83+
replacer := strings.NewReplacer("-", "_")
84+
viper.SetEnvKeyReplacer(replacer)
85+
86+
// suppress the incorrect prefix in glog output
87+
flag.CommandLine.Parse([]string{})
88+
viper.BindPFlags(cmd.PersistentFlags())
89+
90+
var cancel context.CancelFunc
91+
92+
ctx, cancel = context.WithCancel(context.Background())
93+
sigs := make(chan os.Signal, 1)
94+
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGSEGV)
95+
96+
go func() {
97+
s := <-sigs
98+
cancel()
99+
klog.Error(fmt.Sprintf("%s %s", s.String(), "Signal received. Exiting"))
100+
}()
101+
102+
}
103+
104+
func main() {
105+
if err := cmd.Execute(); err != nil {
106+
klog.Fatal(err.Error())
107+
108+
}
109+
}
110+
111+
func run(args []string, endpoint string) error {
112+
// Initialize minio client object.
113+
minioClient, err := minio.New(s3Endpoint, accessKey, secretKey, false)
114+
if err != nil {
115+
klog.Fatalln(err)
116+
}
117+
minioAdminClient, err := madmin.New(s3Endpoint, accessKey, secretKey, false)
118+
if err != nil {
119+
klog.Fatalln(err)
120+
}
121+
cds := DriverServer{Name: PROVISIONER_NAME, Version: VERSION, S3Client: minioClient, S3AdminClient: minioAdminClient}
122+
s := grpcserver.NewNonBlockingGRPCServer()
123+
s.Start(endpoint, &cds)
124+
s.Wait()
125+
return nil
126+
}

Diff for: container-object-storage-interface-provisioner-sidecar/go.mod

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
module github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar
1+
module sigs.k8s.io/container-object-storage-interface-provisioner-sidecar
22

33
go 1.15
44

55
require (
6+
github.com/go-ini/ini v1.62.0 // indirect
67
github.com/kubernetes-csi/csi-lib-utils v0.9.0
7-
github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201217233824-6b4158ff7e28
8-
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20201217184109-8cbf84dde8d3
8+
github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210112203836-a74c106d3ab3
9+
github.com/kubernetes-sigs/container-object-storage-interface-spec v0.0.0-20210107181053-ef523592ca74
10+
github.com/minio/minio v0.0.0-20210112204746-e09196d62633
11+
github.com/minio/minio-go v6.0.14+incompatible
912
github.com/spf13/cobra v0.0.5
10-
golang.org/x/net v0.0.0-20200707034311-ab3426394381
13+
github.com/spf13/viper v1.3.2
14+
golang.org/x/net v0.0.0-20201216054612-986b41b23924
1115
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
1216
google.golang.org/grpc v1.34.0
1317
k8s.io/api v0.19.4

0 commit comments

Comments
 (0)