Skip to content

Commit cf53a73

Browse files
Rakshith-Rmergify[bot]
authored andcommitted
sidecar: add initial sidecar setup with client
Sidecar accepts timeout and csiAddonsAddress, tries to connect, probe and gets driverName from the CSI Driver. Signed-off-by: Rakshith R <rar@redhat.com>
1 parent 4a64e23 commit cf53a73

File tree

6 files changed

+506
-3
lines changed

6 files changed

+506
-3
lines changed

go.mod

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@ module github.com/csi-addons/kubernetes-csi-addons
33
go 1.17
44

55
require (
6+
github.com/csi-addons/spec v0.1.2-0.20211208151110-e720204c043b
7+
github.com/kubernetes-csi/csi-lib-utils v0.10.0
68
github.com/onsi/ginkgo v1.16.4
79
github.com/onsi/gomega v1.15.0
10+
google.golang.org/grpc v1.43.0
11+
google.golang.org/protobuf v1.27.1
812
k8s.io/apimachinery v0.22.1
913
k8s.io/client-go v0.22.1
14+
k8s.io/klog/v2 v2.9.0
1015
sigs.k8s.io/controller-runtime v0.10.0
1116
)
1217

@@ -19,6 +24,7 @@ require (
1924
github.com/Azure/go-autorest/logger v0.2.1 // indirect
2025
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
2126
github.com/beorn7/perks v1.0.1 // indirect
27+
github.com/blang/semver v3.5.1+incompatible // indirect
2228
github.com/cespare/xxhash/v2 v2.1.1 // indirect
2329
github.com/davecgh/go-spew v1.1.1 // indirect
2430
github.com/evanphx/json-patch v4.11.0+incompatible // indirect
@@ -57,15 +63,14 @@ require (
5763
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
5864
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
5965
google.golang.org/appengine v1.6.7 // indirect
60-
google.golang.org/protobuf v1.27.1 // indirect
66+
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect
6167
gopkg.in/inf.v0 v0.9.1 // indirect
6268
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
6369
gopkg.in/yaml.v2 v2.4.0 // indirect
6470
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
6571
k8s.io/api v0.22.1 // indirect
6672
k8s.io/apiextensions-apiserver v0.22.1 // indirect
6773
k8s.io/component-base v0.22.1 // indirect
68-
k8s.io/klog/v2 v2.9.0 // indirect
6974
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect
7075
k8s.io/utils v0.0.0-20210802155522-efc7438f0176 // indirect
7176
sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect

go.sum

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
6565
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
6666
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
6767
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
68+
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
6869
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
6970
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
7071
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
@@ -79,9 +80,15 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
7980
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
8081
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
8182
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
83+
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
84+
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
85+
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
86+
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
8287
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
8388
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
8489
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
90+
github.com/container-storage-interface/spec v1.5.0 h1:lvKxe3uLgqQeVQcrnL2CPQKISoKjTJxojEs9cBk+HXo=
91+
github.com/container-storage-interface/spec v1.5.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s=
8592
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
8693
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
8794
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
@@ -92,6 +99,8 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
9299
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
93100
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
94101
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
102+
github.com/csi-addons/spec v0.1.2-0.20211208151110-e720204c043b h1:nBr77+3rcC8DFvhoV1t6rQFwAmvU1TekTJ5FFDK+sKM=
103+
github.com/csi-addons/spec v0.1.2-0.20211208151110-e720204c043b/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
95104
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
96105
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
97106
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -107,6 +116,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
107116
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
108117
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
109118
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
119+
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
110120
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
111121
github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
112122
github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs=
@@ -269,6 +279,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
269279
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
270280
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
271281
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
282+
github.com/kubernetes-csi/csi-lib-utils v0.10.0 h1:Aqm8X81eCzzfH/bvIEqSWtcbK9HF9NbFk4d+le1snVA=
283+
github.com/kubernetes-csi/csi-lib-utils v0.10.0/go.mod h1:BmGZZB16L18+9+Lgg9YWwBKfNEHIDdgGfAyuW6p2NV0=
272284
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
273285
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
274286
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -680,6 +692,7 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG
680692
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
681693
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
682694
google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
695+
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0=
683696
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
684697
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
685698
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -694,6 +707,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
694707
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
695708
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
696709
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
710+
google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=
711+
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
697712
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
698713
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
699714
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -705,7 +720,6 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
705720
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
706721
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
707722
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
708-
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
709723
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
710724
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
711725
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
@@ -747,16 +761,20 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
747761
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
748762
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
749763
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
764+
k8s.io/api v0.22.0/go.mod h1:0AoXXqst47OI/L0oGKq9DG61dvGRPXs7X4/B7KyjBCU=
750765
k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY=
751766
k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY=
752767
k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE=
753768
k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c=
769+
k8s.io/apimachinery v0.22.0/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
754770
k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM=
755771
k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
756772
k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400=
773+
k8s.io/client-go v0.22.0/go.mod h1:GUjIuXR5PiEv/RVK5OODUsm6eZk7wtSWZSaSJbpFdGg=
757774
k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw=
758775
k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
759776
k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o=
777+
k8s.io/component-base v0.22.0/go.mod h1:SXj6Z+V6P6GsBhHZVbWCw9hFjUdUYnJerlhhPnYCBCg=
760778
k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo=
761779
k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo=
762780
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=

sidecar/internal/client/client.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/*
2+
Copyright 2021 The Kubernetes-CSI-Addons 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 client
18+
19+
import (
20+
"context"
21+
"errors"
22+
"fmt"
23+
"time"
24+
25+
"github.com/csi-addons/spec/lib/go/identity"
26+
"github.com/kubernetes-csi/csi-lib-utils/connection"
27+
"github.com/kubernetes-csi/csi-lib-utils/metrics"
28+
"google.golang.org/grpc"
29+
"google.golang.org/grpc/codes"
30+
"google.golang.org/grpc/status"
31+
"k8s.io/klog/v2"
32+
)
33+
34+
// Client holds the GRPC connenction details
35+
type Client struct {
36+
Client *grpc.ClientConn
37+
Timeout time.Duration
38+
// Interval of trying to call Probe() until it succeeds
39+
probeInterval time.Duration
40+
}
41+
42+
// Connect to the GRPC client
43+
func (c *Client) connect(address string) (*grpc.ClientConn, error) {
44+
return connection.Connect(address, metrics.NewCSIMetricsManager(""), connection.OnConnectionLoss(connection.ExitOnConnectionLoss()))
45+
}
46+
47+
// New creates and returns the GRPC client
48+
func New(address string, timeout time.Duration) (*Client, error) {
49+
c := &Client{}
50+
cc, err := c.connect(address)
51+
if err != nil {
52+
return nil, err
53+
}
54+
c.Client = cc
55+
c.Timeout = timeout
56+
c.probeInterval = time.Second
57+
return c, nil
58+
}
59+
60+
// Probe calls Probe() of a CSI driver and waits until the driver becomes ready.
61+
// Any error other than timeout is returned.
62+
func (c *Client) Probe() error {
63+
for {
64+
klog.Info("Probing CSI driver for readiness")
65+
ready, err := c.probeOnce()
66+
if err != nil {
67+
st, ok := status.FromError(err)
68+
if !ok {
69+
// This is not gRPC error. The probe must have failed before gRPC
70+
// method was called, otherwise we would get gRPC error.
71+
return fmt.Errorf("CSI driver probe failed: %s", err)
72+
}
73+
if st.Code() != codes.DeadlineExceeded {
74+
return fmt.Errorf("CSI driver probe failed: %s", err)
75+
}
76+
// Timeout -> driver is not ready. Fall through to sleep() below.
77+
klog.Warning("CSI driver probe timed out")
78+
} else {
79+
if ready {
80+
return nil
81+
}
82+
klog.Warning("CSI driver is not ready")
83+
}
84+
// Timeout was returned or driver is not ready.
85+
time.Sleep(c.probeInterval)
86+
}
87+
}
88+
89+
// probeOnce calls driver Probe() just once and returns its result without any processing.
90+
func (c *Client) probeOnce() (bool, error) {
91+
ctx, cancel := context.WithTimeout(context.TODO(), c.Timeout)
92+
defer cancel()
93+
94+
identityClient := identity.NewIdentityClient(c.Client)
95+
req := identity.ProbeRequest{}
96+
97+
rsp, err := identityClient.Probe(ctx, &req)
98+
99+
if err != nil {
100+
return false, err
101+
}
102+
103+
r := rsp.GetReady()
104+
if r == nil {
105+
// "If not present, the caller SHALL assume that the plugin is in a ready state"
106+
return true, nil
107+
}
108+
return r.GetValue(), nil
109+
}
110+
111+
// GetDriverName gets the driver name from the driver
112+
func (c *Client) GetDriverName() (string, error) {
113+
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
114+
defer cancel()
115+
116+
identityClient := identity.NewIdentityClient(c.Client)
117+
118+
req := identity.GetIdentityRequest{}
119+
rsp, err := identityClient.GetIdentity(ctx, &req)
120+
if err != nil {
121+
return "", err
122+
}
123+
124+
name := rsp.GetName()
125+
if name == "" {
126+
return "", errors.New("driver name is empty")
127+
}
128+
129+
return name, nil
130+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
Copyright 2021 The Kubernetes-CSI-Addons 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 csiaddonsnode
18+
19+
import (
20+
"context"
21+
"fmt"
22+
"os"
23+
"strings"
24+
25+
csiaddonsv1alpha1 "github.com/csi-addons/kubernetes-csi-addons/api/v1alpha1"
26+
27+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
"k8s.io/apimachinery/pkg/runtime/serializer"
29+
"k8s.io/apimachinery/pkg/types"
30+
"k8s.io/client-go/kubernetes/scheme"
31+
"k8s.io/client-go/rest"
32+
)
33+
34+
const (
35+
podNameEnvKey = "POD_NAME"
36+
podNamespaceEnvKey = "POD_NAMESPACE"
37+
podUIDEnvKey = "POD_UID"
38+
podIPEnvKey = "POD_IP"
39+
)
40+
41+
// Deploy creates CSIAddonsNode custom resource with all required information.
42+
func Deploy(config *rest.Config, driverName, nodeID, endpoint string) error {
43+
object, err := getCSIAddonsNode(driverName, endpoint, nodeID)
44+
if err != nil {
45+
return fmt.Errorf("failed to get csiaddonsNode object: %w", err)
46+
}
47+
48+
err = csiaddonsv1alpha1.AddToScheme(scheme.Scheme)
49+
if err != nil {
50+
return fmt.Errorf("failed to add scheme: %w", err)
51+
}
52+
53+
crdConfig := *config
54+
crdConfig.ContentConfig.GroupVersion = &csiaddonsv1alpha1.GroupVersion
55+
crdConfig.APIPath = "/apis"
56+
crdConfig.NegotiatedSerializer = serializer.NewCodecFactory(scheme.Scheme)
57+
crdConfig.UserAgent = rest.DefaultKubernetesUserAgent()
58+
59+
c, err := rest.UnversionedRESTClientFor(&crdConfig)
60+
if err != nil {
61+
return fmt.Errorf("failed to get REST Client: %w", err)
62+
}
63+
64+
err = c.Post().
65+
Resource("csiaddonsnodes").
66+
Namespace(object.Namespace).
67+
Name(object.Name).
68+
Body(object).
69+
Do(context.TODO()).
70+
Into(nil)
71+
72+
if err != nil && !strings.Contains(err.Error(), "already exists") {
73+
return fmt.Errorf("failed to create csiaddonsnode object: %w", err)
74+
}
75+
76+
return nil
77+
}
78+
79+
// lookupEnc returns environmental variable value given the name.
80+
func lookupEnv(name string) (string, error) {
81+
val, ok := os.LookupEnv(name)
82+
if !ok {
83+
return val, fmt.Errorf("required environmental variable %q not found", name)
84+
}
85+
86+
return val, nil
87+
}
88+
89+
// getCSIAddonsNode fills required information and return CSIAddonsNode object.
90+
func getCSIAddonsNode(driverName, endpoint, nodeID string) (*csiaddonsv1alpha1.CSIAddonsNode, error) {
91+
podName, err := lookupEnv(podNameEnvKey)
92+
if err != nil {
93+
return nil, err
94+
}
95+
podNamespace, err := lookupEnv(podNamespaceEnvKey)
96+
if err != nil {
97+
return nil, err
98+
}
99+
podUID, err := lookupEnv(podUIDEnvKey)
100+
if err != nil {
101+
return nil, err
102+
}
103+
podIP, err := lookupEnv(podIPEnvKey)
104+
if err != nil {
105+
return nil, err
106+
}
107+
108+
return &csiaddonsv1alpha1.CSIAddonsNode{
109+
ObjectMeta: v1.ObjectMeta{
110+
Name: podUID,
111+
Namespace: podNamespace,
112+
OwnerReferences: []v1.OwnerReference{
113+
{
114+
APIVersion: "v1",
115+
Kind: "Pod",
116+
Name: podName,
117+
UID: types.UID(podUID),
118+
},
119+
},
120+
},
121+
Spec: csiaddonsv1alpha1.CSIAddonsNodeSpec{
122+
Driver: csiaddonsv1alpha1.CSIAddonsNodeDriver{
123+
Name: driverName,
124+
EndPoint: podIP + ":" + endpoint,
125+
NodeID: nodeID,
126+
},
127+
},
128+
}, nil
129+
}

0 commit comments

Comments
 (0)