forked from hpe-storage/common-host-libs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
provider.go
173 lines (153 loc) · 5.21 KB
/
provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// Copyright 2019 Hewlett Packard Enterprise Development LP
package provider
import (
"fmt"
"github.com/hpe-storage/common-host-libs/connectivity"
log "github.com/hpe-storage/common-host-libs/logger"
"os"
"sync"
"time"
)
var (
providerClient *connectivity.Client
clientLock sync.Mutex
// VersionLimits indicates options limited by provider versions
VersionLimits = map[string][]optionLimit{
"0.0": []optionLimit{
{"importVol", []string{"reverseRepl", "takeover", "snapshot", "restore"}},
},
}
)
const (
// URI's
// ActivateURI represents activate endpoint
ActivateURI = "/Plugin.Activate"
// CreateURI represents create endpoint
CreateURI = "/VolumeDriver.Create"
// UpdateURI represents update endpoint
UpdateURI = "/VolumeDriver.Update"
// ListURI represents list endpoint
ListURI = "/VolumeDriver.List"
// CapabilitiesURI represents capabilities endpoint
CapabilitiesURI = "/VolumeDriver.Capabilities"
// MountURI represents mount endpoint
MountURI = "/VolumeDriver.Mount"
// UnmountURI represents unmount endpoint
UnmountURI = "/VolumeDriver.Unmount"
// VolumeDriverGetURI represents get endpoint
VolumeDriverGetURI = "/VolumeDriver.Get"
// NimbleDetachURI represents nimble detach endpoint
NimbleDetachURI = "/Nimble.Detach"
// NimbleGetURI represents nimble get endpoint
NimbleGetURI = "/Nimble.Get"
// NimbleConfURI represents nimble config endpoint
NimbleConfURI = "/HPEVolume.Config"
//NimbleLoginURI :
NimbleLoginURI = "/Nimble.Login"
//NimbleRemoveURI represent cert remove endpoint
NimbleRemoveURI = "/Nimble.RemoveCert"
// RemoveURI represents volume remove endpoint
RemoveURI = "/VolumeDriver.Remove"
// HPEVolumeVersionURI version URI
HPEVolumeVersionURI = "/HPEVolume.Version"
// timeouts
providerClientTimeout = time.Duration(300) * time.Second
// env params
// EnvIP represents provider IP env
EnvIP = "PROVIDER_IP"
// EnvService represents service name when provider running as k8s service
EnvService = "PROVIDER_SERVICE"
// EnvUsername represents provider username env
EnvUsername = "PROVIDER_USERNAME"
// EnvPassword represents provider password env
EnvPassword = "PROVIDER_PASSWORD"
// EnvPort represents provider port env
EnvPort = "PROVIDER_PORT"
// EnvInsecure represents http or https mode
EnvInsecure = "INSECURE"
)
// User : provide HPE User API keys
type User struct {
AccessKey string `json:"access_key,omitempty"`
AccessSecret string `json:"access_secret,omitempty"`
}
// GetProviderClient returns container-storage-provider client based on the plugin type
func GetProviderClient() (*connectivity.Client, error) {
log.Trace(">>> getProviderClient")
defer log.Trace("<<< getProviderClient")
var err error
// see if we have already created one
if providerClient != nil {
return providerClient, nil
}
clientLock.Lock()
defer clientLock.Unlock()
if IsHPECloudVolumesPlugin() {
// get hpe cloud volumes client
providerClient, err = getCloudContainerProviderClient()
} else if IsSimplivityPlugin() {
// get simplivity client
providerClient, err = getSimplivityContainerProviderClient()
} else {
// assume nimble client by default
providerClient, err = getNimbleContainerProviderClient()
}
if err != nil {
log.Errorf("unable to get container provider client, err %s", err.Error())
return nil, err
}
return providerClient, err
}
// GetProviderIP returns container-storage-provider IP
func GetProviderIP() (ip string, err error) {
if ip = os.Getenv(EnvIP); ip != "" {
return ip, nil
}
return "", fmt.Errorf("%s env is not set", EnvIP)
}
// GetProviderAccessKeys returns api access keys for the provider configured in env
func GetProviderAccessKeys() (*User, error) {
// read from environment variables
accessKey := os.Getenv(EnvUsername)
if accessKey == "" {
return nil, fmt.Errorf("env variable %s is not provided", EnvUsername)
}
accessSecret := os.Getenv(EnvPassword)
if accessKey == "" {
return nil, fmt.Errorf("env variable %s is not provided", EnvPassword)
}
return &User{AccessKey: accessKey, AccessSecret: accessSecret}, nil
}
// GetProviderURI returns container storage provider URI based on env set or using passed in defaults
func GetProviderURI(defaultProviderPortal, defaultProviderPort, basePath string) (providerURI string, err error) {
// Assume defaults
portal := defaultProviderPortal
port := defaultProviderPort
// Override ip:port if specified from env
if envportal := os.Getenv(EnvIP); envportal != "" {
portal = envportal
}
if envport := os.Getenv(EnvPort); envport != "" {
port = envport
}
// if service name is provided, then handle container-provider running as k8s service
if envService := os.Getenv(EnvService); envService != "" {
// override with service name
portal = envService
// allow http connection to service
os.Setenv(EnvInsecure, "true")
}
if port == "" || portal == "" {
return "", fmt.Errorf("unable to get provider uri as environment param %s/%s are not set", EnvIP, EnvPort)
}
if os.Getenv(EnvInsecure) == "true" {
providerURI = fmt.Sprintf("http://%s:%s", portal, port)
} else {
providerURI = fmt.Sprintf("https://%s:%s", portal, port)
}
if basePath != "" {
providerURI = providerURI + basePath
}
log.Debugf("using container provider URI %s", providerURI)
return providerURI, nil
}