mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
When we implemented CSI, the types of the fields for access mode and attachment mode on volume requests were defined with a prefix "CSI". This gets confusing now that we have dynamic host volumes using the same fields. Fortunately the original was a typedef on string, and the Go API in the `api` package just uses strings directly, so we can change the name of the type without breaking backwards compatibility for the msgpack wire format. Update the names to `VolumeAccessMode` and `VolumeAttachmentMode`. Keep the CSI and DHV specific value constant names for these fields (they aren't currently 1:1), so that we can easily differentiate in a given bit of code which values are valid. Ref: https://github.com/hashicorp/nomad/pull/24881#discussion_r1920702890
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package csimanager
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/nomad/client/pluginmanager"
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
"github.com/hashicorp/nomad/plugins/csi"
|
|
)
|
|
|
|
type MountInfo struct {
|
|
Source string
|
|
IsDevice bool
|
|
}
|
|
|
|
func (mi *MountInfo) Copy() *MountInfo {
|
|
if mi == nil {
|
|
return nil
|
|
}
|
|
|
|
nmi := new(MountInfo)
|
|
*nmi = *mi
|
|
return nmi
|
|
}
|
|
|
|
type UsageOptions struct {
|
|
ReadOnly bool
|
|
AttachmentMode structs.VolumeAttachmentMode
|
|
AccessMode structs.VolumeAccessMode
|
|
MountOptions *structs.CSIMountOptions
|
|
}
|
|
|
|
// ToFS is used by a VolumeManager to construct the path to where a volume
|
|
// should be staged/published. It should always return a string that is easy
|
|
// enough to manage as a filesystem path segment (e.g avoid starting the string
|
|
// with a special character).
|
|
func (u *UsageOptions) ToFS() string {
|
|
var sb strings.Builder
|
|
|
|
if u.ReadOnly {
|
|
sb.WriteString("ro-")
|
|
} else {
|
|
sb.WriteString("rw-")
|
|
}
|
|
|
|
sb.WriteString(string(u.AttachmentMode))
|
|
sb.WriteString("-")
|
|
sb.WriteString(string(u.AccessMode))
|
|
|
|
return sb.String()
|
|
}
|
|
|
|
type VolumeManager interface {
|
|
MountVolume(ctx context.Context, vol *structs.CSIVolume, alloc *structs.Allocation, usageOpts *UsageOptions, publishContext map[string]string) (*MountInfo, error)
|
|
UnmountVolume(ctx context.Context, volNS, volID, remoteID, allocID string, usageOpts *UsageOptions) error
|
|
HasMount(ctx context.Context, mountInfo *MountInfo) (bool, error)
|
|
ExpandVolume(ctx context.Context, volNS, volID, remoteID, allocID string, usageOpts *UsageOptions, capacity *csi.CapacityRange) (int64, error)
|
|
ExternalID() string
|
|
}
|
|
|
|
type Manager interface {
|
|
// PluginManager returns a PluginManager for use by the node fingerprinter.
|
|
PluginManager() pluginmanager.PluginManager
|
|
|
|
// WaitForPlugin waits for the plugin to become available,
|
|
// or until its context is canceled or times out.
|
|
WaitForPlugin(ctx context.Context, pluginType, pluginID string) error
|
|
|
|
// ManagerForPlugin returns a VolumeManager for the plugin ID associated
|
|
// with the volume. Returns an error if this plugin isn't registered.
|
|
ManagerForPlugin(ctx context.Context, pluginID string) (VolumeManager, error)
|
|
|
|
// Shutdown shuts down the Manager and unmounts any locally attached volumes.
|
|
Shutdown()
|
|
}
|