agent/util/paramstore/paramstore.go (93 lines of code) (raw):
package paramstore
import (
"errors"
"fmt"
"time"
"github.com/aliyun/alibaba-cloud-sdk-go/services/oos"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/agent/util"
"github.com/aliyun/aliyun_assist_client/common/metaserver"
"github.com/aliyun/aliyun_assist_client/common/networkcategory"
)
var (
cacheRamRole = ""
cacheRamRoleErr error
lastUpdateTime time.Time
)
var (
ErrRoleNameFailed = errors.New("RoleNameFailed")
ErrParameterStoreNotAccessible = errors.New("ParameterStoreNotAccessible")
ErrParameterFailed = errors.New("ParameterFailed")
)
func GetRoleName() (string, error) {
cacheRamRole, cacheRamRoleErr = metaserver.GetSecurityCredentials(log.GetLogger())
if cacheRamRoleErr != nil {
cacheRamRole = ""
}
lastUpdateTime = time.Now()
return cacheRamRole, cacheRamRoleErr
}
func GetRoleNameTtl(ttl time.Duration) (string, error) {
if time.Since(lastUpdateTime) >= ttl {
return GetRoleName()
}
return cacheRamRole, cacheRamRoleErr
}
func GetSecretParam(name string) (string, error) {
region := util.GetRegionId()
roleName, err := GetRoleName()
if err != nil {
log.GetLogger().Errorln("GetRoleName failed ", "error:", err.Error())
errMsg := fmt.Sprintf("Get role name failed: %s.", err.Error())
return errMsg, ErrRoleNameFailed
}
ecs_client, err := oos.NewClientWithEcsRamRole(region, roleName)
if err != nil {
log.GetLogger().Errorln("NewClientWithEcsRamRole failed:", roleName, " error:", err.Error())
errMsg := fmt.Sprintf("Create new client with ecs ram role %s failed: %s.", roleName, err.Error())
return errMsg, ErrParameterStoreNotAccessible
}
if networkcategory.Get() == networkcategory.NetworkVPC {
ecs_client.Network = "vpc"
}
// GetSecretParameter
request := oos.CreateGetSecretParameterRequest()
request.Name = name
request.WithDecryption = "true"
response, err := ecs_client.GetSecretParameter(request)
if err != nil {
log.GetLogger().Errorln("GetSecretParameter failed:", roleName, " error:", err.Error())
errMsg := fmt.Sprintf("Get secret parameter '%s' with ecs ram role %s failed: %s.", name, roleName, err.Error())
return errMsg, ErrParameterFailed
}
value := response.Parameter.Value
return value, err
}
func GetParam(name string) (string, error) {
region := util.GetRegionId()
roleName, err := GetRoleName()
if err != nil {
log.GetLogger().Errorln("GetRoleName failed ", "error:", err.Error())
errMsg := fmt.Sprintf("Get role name failed: %s.", err.Error())
return errMsg, ErrRoleNameFailed
}
ecs_client, err := oos.NewClientWithEcsRamRole(region, roleName)
if err != nil {
log.GetLogger().Errorln("NewClientWithEcsRamRole failed:", roleName, " error:", err.Error())
errMsg := fmt.Sprintf("Create new client with ecs ram role %s failed: %s.", roleName, err.Error())
return errMsg, ErrParameterStoreNotAccessible
}
if networkcategory.Get() == networkcategory.NetworkVPC {
ecs_client.Network = "vpc"
}
request := oos.CreateGetParameterRequest()
request.Name = name
request.Scheme = "https"
response, err := ecs_client.GetParameter(request)
if err != nil {
log.GetLogger().Errorln("GetParameter failed:", roleName, " error:", err.Error())
errMsg := fmt.Sprintf("Get parameter '%s' with ecs ram role %s failed: %s.", name, roleName, err.Error())
return errMsg, ErrParameterFailed
}
value := response.Parameter.Value
return value, err
}