mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-24 22:10:23 +00:00
171ba6a65d
Bumps the github-dependencies group with 8 updates in the / directory: | Package | From | To | | --- | --- | --- | | [github.com/IBM/keyprotect-go-client](https://github.com/IBM/keyprotect-go-client) | `0.12.2` | `0.14.1` | | [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) | `1.53.14` | `1.54.6` | | [github.com/aws/aws-sdk-go-v2/service/sts](https://github.com/aws/aws-sdk-go-v2) | `1.28.1` | `1.29.1` | | [github.com/hashicorp/vault/api](https://github.com/hashicorp/vault) | `1.12.0` | `1.14.0` | | [github.com/kubernetes-csi/csi-lib-utils](https://github.com/kubernetes-csi/csi-lib-utils) | `0.17.0` | `0.18.1` | | [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `2.17.1` | `2.19.0` | | [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) | `1.18.0` | `1.19.1` | | [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) | `1.6.0` | `1.7.0` | Updates `github.com/IBM/keyprotect-go-client` from 0.12.2 to 0.14.1 - [Release notes](https://github.com/IBM/keyprotect-go-client/releases) - [Changelog](https://github.com/IBM/keyprotect-go-client/blob/master/CHANGELOG.md) - [Commits](https://github.com/IBM/keyprotect-go-client/compare/v0.12.2...v0.14.1) Updates `github.com/aws/aws-sdk-go` from 1.53.14 to 1.54.6 - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.53.14...v1.54.6) Updates `github.com/aws/aws-sdk-go-v2/service/sts` from 1.28.1 to 1.29.1 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ecr/v1.28.1...service/s3/v1.29.1) Updates `github.com/hashicorp/vault/api` from 1.12.0 to 1.14.0 - [Release notes](https://github.com/hashicorp/vault/releases) - [Changelog](https://github.com/hashicorp/vault/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/vault/compare/v1.12.0...v1.14.0) Updates `github.com/kubernetes-csi/csi-lib-utils` from 0.17.0 to 0.18.1 - [Release notes](https://github.com/kubernetes-csi/csi-lib-utils/releases) - [Commits](https://github.com/kubernetes-csi/csi-lib-utils/compare/v0.17.0...v0.18.1) Updates `github.com/onsi/ginkgo/v2` from 2.17.1 to 2.19.0 - [Release notes](https://github.com/onsi/ginkgo/releases) - [Changelog](https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/ginkgo/compare/v2.17.1...v2.19.0) Updates `github.com/onsi/gomega` from 1.32.0 to 1.33.1 - [Release notes](https://github.com/onsi/gomega/releases) - [Changelog](https://github.com/onsi/gomega/blob/master/CHANGELOG.md) - [Commits](https://github.com/onsi/gomega/compare/v1.32.0...v1.33.1) Updates `github.com/prometheus/client_golang` from 1.18.0 to 1.19.1 - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.18.0...v1.19.1) Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.6.0 to 1.7.0 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.6.0...sdk/azcore/v1.7.0) --- updated-dependencies: - dependency-name: github.com/IBM/keyprotect-go-client dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/aws/aws-sdk-go-v2/service/sts dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/hashicorp/vault/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/kubernetes-csi/csi-lib-utils dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/onsi/ginkgo/v2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/onsi/gomega dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
197 lines
5.5 KiB
Go
197 lines
5.5 KiB
Go
/*
|
|
Copyright 2019 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package rpc
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
|
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
|
|
|
"k8s.io/klog/v2"
|
|
)
|
|
|
|
const (
|
|
// Interval of trying to call Probe() until it succeeds
|
|
probeInterval = 1 * time.Second
|
|
)
|
|
|
|
// GetDriverName returns name of CSI driver.
|
|
func GetDriverName(ctx context.Context, conn *grpc.ClientConn) (string, error) {
|
|
client := csi.NewIdentityClient(conn)
|
|
|
|
req := csi.GetPluginInfoRequest{}
|
|
rsp, err := client.GetPluginInfo(ctx, &req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
name := rsp.GetName()
|
|
if name == "" {
|
|
return "", fmt.Errorf("driver name is empty")
|
|
}
|
|
return name, nil
|
|
}
|
|
|
|
// PluginCapabilitySet is set of CSI plugin capabilities. Only supported capabilities are in the map.
|
|
type PluginCapabilitySet map[csi.PluginCapability_Service_Type]bool
|
|
|
|
// GetPluginCapabilities returns set of supported capabilities of CSI driver.
|
|
func GetPluginCapabilities(ctx context.Context, conn *grpc.ClientConn) (PluginCapabilitySet, error) {
|
|
client := csi.NewIdentityClient(conn)
|
|
req := csi.GetPluginCapabilitiesRequest{}
|
|
rsp, err := client.GetPluginCapabilities(ctx, &req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
caps := PluginCapabilitySet{}
|
|
for _, cap := range rsp.GetCapabilities() {
|
|
if cap == nil {
|
|
continue
|
|
}
|
|
srv := cap.GetService()
|
|
if srv == nil {
|
|
continue
|
|
}
|
|
t := srv.GetType()
|
|
caps[t] = true
|
|
}
|
|
return caps, nil
|
|
}
|
|
|
|
// ControllerCapabilitySet is set of CSI controller capabilities. Only supported capabilities are in the map.
|
|
type ControllerCapabilitySet map[csi.ControllerServiceCapability_RPC_Type]bool
|
|
|
|
// GetControllerCapabilities returns set of supported controller capabilities of CSI driver.
|
|
func GetControllerCapabilities(ctx context.Context, conn *grpc.ClientConn) (ControllerCapabilitySet, error) {
|
|
client := csi.NewControllerClient(conn)
|
|
req := csi.ControllerGetCapabilitiesRequest{}
|
|
rsp, err := client.ControllerGetCapabilities(ctx, &req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
caps := ControllerCapabilitySet{}
|
|
for _, cap := range rsp.GetCapabilities() {
|
|
if cap == nil {
|
|
continue
|
|
}
|
|
rpc := cap.GetRpc()
|
|
if rpc == nil {
|
|
continue
|
|
}
|
|
t := rpc.GetType()
|
|
caps[t] = true
|
|
}
|
|
return caps, nil
|
|
}
|
|
|
|
// GroupControllerCapabilitySet is set of CSI groupcontroller capabilities. Only supported capabilities are in the map.
|
|
type GroupControllerCapabilitySet map[csi.GroupControllerServiceCapability_RPC_Type]bool
|
|
|
|
// GetGroupControllerCapabilities returns set of supported group controller capabilities of CSI driver.
|
|
func GetGroupControllerCapabilities(ctx context.Context, conn *grpc.ClientConn) (GroupControllerCapabilitySet, error) {
|
|
client := csi.NewGroupControllerClient(conn)
|
|
req := csi.GroupControllerGetCapabilitiesRequest{}
|
|
rsp, err := client.GroupControllerGetCapabilities(ctx, &req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
caps := GroupControllerCapabilitySet{}
|
|
for _, cap := range rsp.GetCapabilities() {
|
|
if cap == nil {
|
|
continue
|
|
}
|
|
rpc := cap.GetRpc()
|
|
if rpc == nil {
|
|
continue
|
|
}
|
|
t := rpc.GetType()
|
|
caps[t] = true
|
|
}
|
|
return caps, nil
|
|
}
|
|
|
|
// ProbeForever calls Probe() of a CSI driver and waits until the driver becomes ready.
|
|
// Any error other than timeout is returned.
|
|
func ProbeForever(ctx context.Context, conn *grpc.ClientConn, singleProbeTimeout time.Duration) error {
|
|
logger := klog.FromContext(ctx)
|
|
ticker := time.NewTicker(probeInterval)
|
|
defer ticker.Stop()
|
|
|
|
for {
|
|
// Run the probe once before waiting for the ticker
|
|
logger.Info("Probing CSI driver for readiness")
|
|
ready, err := probeOnce(ctx, conn, singleProbeTimeout)
|
|
if err != nil {
|
|
st, ok := status.FromError(err)
|
|
if !ok {
|
|
// This is not gRPC error. The probe must have failed before gRPC
|
|
// method was called, otherwise we would get gRPC error.
|
|
return fmt.Errorf("CSI driver probe failed: %s", err)
|
|
}
|
|
if st.Code() != codes.DeadlineExceeded {
|
|
return fmt.Errorf("CSI driver probe failed: %s", err)
|
|
}
|
|
// Timeout -> driver is not ready. Fall through to sleep() below.
|
|
logger.Info("CSI driver probe timed out")
|
|
} else {
|
|
if ready {
|
|
return nil
|
|
}
|
|
logger.Info("CSI driver is not ready")
|
|
}
|
|
select {
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
case <-ticker.C:
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
// probeOnce is a helper to simplify defer cancel()
|
|
func probeOnce(ctx context.Context, conn *grpc.ClientConn, timeout time.Duration) (bool, error) {
|
|
ctx, cancel := context.WithTimeout(ctx, timeout)
|
|
defer cancel()
|
|
return Probe(ctx, conn)
|
|
}
|
|
|
|
// Probe calls driver Probe() just once and returns its result without any processing.
|
|
func Probe(ctx context.Context, conn *grpc.ClientConn) (ready bool, err error) {
|
|
client := csi.NewIdentityClient(conn)
|
|
|
|
req := csi.ProbeRequest{}
|
|
rsp, err := client.Probe(ctx, &req)
|
|
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
r := rsp.GetReady()
|
|
if r == nil {
|
|
// "If not present, the caller SHALL assume that the plugin is in a ready state"
|
|
return true, nil
|
|
}
|
|
return r.GetValue(), nil
|
|
}
|