1. change glog to klog

2. move types to api package to avoid cyclic import
This commit is contained in:
Jeff
2019-09-16 12:46:53 +08:00
committed by zryfish
parent 79735c4543
commit 97c9a1786a
109 changed files with 1076 additions and 552 deletions

View File

@@ -15,7 +15,7 @@ package esclient
import (
"encoding/json"
"fmt"
"github.com/golang/glog"
"k8s.io/klog"
"net/http"
"strconv"
"strings"
@@ -64,7 +64,7 @@ func (cfg *Config) WriteESConfigs() {
config = cfg
if err := detectVersionMajor(config); err != nil {
glog.Errorln(err)
klog.Errorln(err)
client = nil
return
}
@@ -250,7 +250,7 @@ func parseQueryResult(operation int, param QueryParameters, body []byte) *QueryR
var response Response
err := jsonIter.Unmarshal(body, &response)
if err != nil {
glog.Errorln(err)
klog.Errorln(err)
queryResult.Status = http.StatusInternalServerError
queryResult.Error = err.Error()
return &queryResult
@@ -261,13 +261,13 @@ func parseQueryResult(operation int, param QueryParameters, body []byte) *QueryR
err := "The query failed with no response"
queryResult.Status = response.Status
queryResult.Error = err
glog.Errorln(err)
klog.Errorln(err)
return &queryResult
}
if response.Shards.Successful != response.Shards.Total {
//Elastic some shards error
glog.Warningf("Not all shards succeed, successful shards: %d, skipped shards: %d, failed shards: %d",
klog.Warningf("Not all shards succeed, successful shards: %d, skipped shards: %d, failed shards: %d",
response.Shards.Successful, response.Shards.Skipped, response.Shards.Failed)
}
@@ -294,7 +294,7 @@ func parseQueryResult(operation int, param QueryParameters, body []byte) *QueryR
var statisticsResponse StatisticsResponseAggregations
err := jsonIter.Unmarshal(response.Aggregations, &statisticsResponse)
if err != nil && response.Aggregations != nil {
glog.Errorln(err)
klog.Errorln(err)
queryResult.Status = http.StatusInternalServerError
queryResult.Error = err.Error()
return &queryResult
@@ -311,7 +311,7 @@ func parseQueryResult(operation int, param QueryParameters, body []byte) *QueryR
var histogramAggregations HistogramAggregations
err := jsonIter.Unmarshal(response.Aggregations, &histogramAggregations)
if err != nil && response.Aggregations != nil {
glog.Errorln(err)
klog.Errorln(err)
queryResult.Status = http.StatusInternalServerError
queryResult.Error = err.Error()
return &queryResult
@@ -361,7 +361,7 @@ func Query(param QueryParameters) *QueryResult {
operation, query, err := createQueryRequest(param)
if err != nil {
glog.Errorln(err)
klog.Errorln(err)
queryResult.Status = http.StatusInternalServerError
queryResult.Error = err.Error()
return queryResult
@@ -369,7 +369,7 @@ func Query(param QueryParameters) *QueryResult {
body, err := client.Search(query)
if err != nil {
glog.Errorln(err)
klog.Errorln(err)
queryResult = new(QueryResult)
queryResult.Status = http.StatusInternalServerError
queryResult.Error = err.Error()

View File

@@ -5,6 +5,7 @@ import (
goredis "github.com/go-redis/redis"
"kubesphere.io/kubesphere/pkg/simple/client/devops"
"kubesphere.io/kubesphere/pkg/simple/client/k8s"
"kubesphere.io/kubesphere/pkg/simple/client/kubesphere"
"kubesphere.io/kubesphere/pkg/simple/client/ldap"
"kubesphere.io/kubesphere/pkg/simple/client/mysql"
"kubesphere.io/kubesphere/pkg/simple/client/openpitrix"
@@ -33,6 +34,7 @@ type ClientSetOptions struct {
s3Options *s2is3.S3Options
openPitrixOptions *openpitrix.OpenPitrixOptions
prometheusOptions *prometheus.PrometheusOptions
kubesphereOptions *kubesphere.KubeSphereOptions
}
func NewClientSetOptions() *ClientSetOptions {
@@ -46,6 +48,7 @@ func NewClientSetOptions() *ClientSetOptions {
s3Options: s2is3.NewS3Options(),
openPitrixOptions: openpitrix.NewOpenPitrixOptions(),
prometheusOptions: prometheus.NewPrometheusOptions(),
kubesphereOptions: kubesphere.NewKubeSphereOptions(),
}
}
@@ -94,6 +97,11 @@ func (c *ClientSetOptions) SetSonarQubeOptions(options *sonarqube.SonarQubeOptio
return c
}
func (c *ClientSetOptions) SetKubeSphereOptions(options *kubesphere.KubeSphereOptions) *ClientSetOptions {
c.kubesphereOptions = options
return c
}
// ClientSet provide best of effort service to initialize clients,
// but there is no guarantee to return a valid client instance,
// so do validity check before use
@@ -111,6 +119,7 @@ type ClientSet struct {
s3Client *s2is3.S3Client
prometheusClient *prometheus.PrometheusClient
openpitrixClient *openpitrix.OpenPitrixClient
kubesphereClient *kubesphere.KubeSphereClient
}
var mutex sync.Mutex
@@ -129,6 +138,10 @@ func NewClientSetFactory(c *ClientSetOptions, stopCh <-chan struct{}) *ClientSet
sharedClientSet.k8sClient = k8s.NewKubernetesClientOrDie(c.kubernetesOptions)
}
if c.kubesphereOptions != nil {
sharedClientSet.kubesphereClient = kubesphere.NewKubeSphereClient(c.kubesphereOptions)
}
return sharedClientSet
}
@@ -318,3 +331,7 @@ func (cs *ClientSet) Prometheus() (*prometheus.PrometheusClient, error) {
return cs.prometheusClient, nil
}
}
func (cs *ClientSet) KubeSphere() *kubesphere.KubeSphereClient {
return cs.kubesphereClient
}

View File

@@ -20,23 +20,14 @@ package kubesphere
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"github.com/golang/glog"
"io/ioutil"
"k8s.io/klog"
"kubesphere.io/kubesphere/pkg/api/devops/v1alpha2"
"kubesphere.io/kubesphere/pkg/constants"
"kubesphere.io/kubesphere/pkg/models"
"kubesphere.io/kubesphere/pkg/models/devops"
"net/http"
"strings"
"sync"
)
var (
accountAPIServer string
ksAPIServer string
once sync.Once
c client
)
type Interface interface {
@@ -45,24 +36,23 @@ type Interface interface {
DescribeGroup(name string) (*models.Group, error)
DeleteGroup(name string) error
ListUsers() (*models.PageableResponse, error)
ListWorkspaceDevOpsProjects(workspace string) (*devops.PageableDevOpsProject, error)
ListWorkspaceDevOpsProjects(workspace string) (*v1alpha2.PageableDevOpsProject, error)
DeleteWorkspaceDevOpsProjects(workspace, devops string) error
}
type client struct {
client http.Client
type KubeSphereClient struct {
client *http.Client
apiServer string
accountServer string
}
func init() {
flag.StringVar(&accountAPIServer, "ks-account-api-server", "http://ks-account.kubesphere-system.svc", "kubesphere account api server")
flag.StringVar(&ksAPIServer, "ks-api-server", "http://ks-apiserver.kubesphere-system.svc", "kubesphere api server")
}
func Client() Interface {
once.Do(func() {
c = client{client: http.Client{}}
})
return c
func NewKubeSphereClient(options *KubeSphereOptions) *KubeSphereClient {
return &KubeSphereClient{
client: &http.Client{},
apiServer: options.APIServer,
accountServer: options.AccountServer,
}
}
type Error struct {
@@ -74,16 +64,16 @@ func (e Error) Error() string {
return fmt.Sprintf("status: %d,message: %s", e.status, e.message)
}
func (c client) CreateGroup(group *models.Group) (*models.Group, error) {
func (c *KubeSphereClient) CreateGroup(group *models.Group) (*models.Group, error) {
data, err := json.Marshal(group)
if err != nil {
return nil, err
}
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups", accountAPIServer), bytes.NewReader(data))
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups", c.accountServer), bytes.NewReader(data))
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
req.Header.Add("Content-Type", "application/json")
@@ -91,14 +81,14 @@ func (c client) CreateGroup(group *models.Group) (*models.Group, error) {
resp, err := c.client.Do(req)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
defer resp.Body.Close()
data, err = ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -109,25 +99,25 @@ func (c client) CreateGroup(group *models.Group) (*models.Group, error) {
err = json.Unmarshal(data, group)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
return group, nil
}
func (c client) UpdateGroup(group *models.Group) (*models.Group, error) {
func (c *KubeSphereClient) UpdateGroup(group *models.Group) (*models.Group, error) {
data, err := json.Marshal(group)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
req, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups/%s", accountAPIServer, group.Name), bytes.NewReader(data))
req, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups/%s", c.accountServer, group.Name), bytes.NewReader(data))
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -141,7 +131,7 @@ func (c client) UpdateGroup(group *models.Group) (*models.Group, error) {
data, err = ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -152,32 +142,32 @@ func (c client) UpdateGroup(group *models.Group) (*models.Group, error) {
err = json.Unmarshal(data, group)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
return group, nil
}
func (c client) DeleteGroup(name string) error {
req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups/%s", accountAPIServer, name), nil)
func (c *KubeSphereClient) DeleteGroup(name string) error {
req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups/%s", c.accountServer, name), nil)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
resp, err := c.client.Do(req)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
@@ -188,24 +178,24 @@ func (c client) DeleteGroup(name string) error {
return nil
}
func (c client) DescribeGroup(name string) (*models.Group, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups/%s", accountAPIServer, name), nil)
func (c *KubeSphereClient) DescribeGroup(name string) (*models.Group, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/groups/%s", c.accountServer, name), nil)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
resp, err := c.client.Do(req)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -217,31 +207,31 @@ func (c client) DescribeGroup(name string) (*models.Group, error) {
err = json.Unmarshal(data, &group)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
return &group, nil
}
func (c client) ListUsers() (*models.PageableResponse, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/users", accountAPIServer), nil)
func (c *KubeSphereClient) ListUsers() (*models.PageableResponse, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kapis/iam.kubesphere.io/v1alpha2/users", c.accountServer), nil)
if err != nil {
return nil, err
}
req.Header.Add("Authorization", accountAPIServer)
req.Header.Add("Authorization", c.accountServer)
resp, err := c.client.Do(req)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -253,78 +243,78 @@ func (c client) ListUsers() (*models.PageableResponse, error) {
err = json.Unmarshal(data, &result)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
return &result, nil
}
func (c client) ListWorkspaceDevOpsProjects(workspace string) (*devops.PageableDevOpsProject, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kapis/tenant.kubesphere.io/v1alpha2/workspaces/%s/devops", ksAPIServer, workspace), nil)
func (c *KubeSphereClient) ListWorkspaceDevOpsProjects(workspace string) (*v1alpha2.PageableDevOpsProject, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kapis/tenant.kubesphere.io/v1alpha2/workspaces/%s/devops", c.apiServer, workspace), nil)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
req.Header.Add(constants.UserNameHeader, constants.AdminUserName)
glog.Info(req.Method, req.URL)
klog.Info(req.Method, req.URL)
resp, err := c.client.Do(req)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
if resp.StatusCode > http.StatusOK {
glog.Error(req.Method, req.URL, resp.StatusCode, string(data))
klog.Error(req.Method, req.URL, resp.StatusCode, string(data))
return nil, Error{resp.StatusCode, string(data)}
}
var result devops.PageableDevOpsProject
var result v1alpha2.PageableDevOpsProject
err = json.Unmarshal(data, &result)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
return &result, nil
}
func (c client) DeleteWorkspaceDevOpsProjects(workspace, devops string) error {
req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/kapis/tenant.kubesphere.io/v1alpha2/workspaces/%s/devops/%s", ksAPIServer, workspace, devops), nil)
func (c *KubeSphereClient) DeleteWorkspaceDevOpsProjects(workspace, devops string) error {
req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/kapis/tenant.kubesphere.io/v1alpha2/workspaces/%s/devops/%s", c.apiServer, workspace, devops), nil)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
req.Header.Add(constants.UserNameHeader, constants.AdminUserName)
glog.Info(req.Method, req.URL)
klog.Info(req.Method, req.URL)
resp, err := c.client.Do(req)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
if resp.StatusCode > http.StatusOK {
glog.Error(req.Method, req.URL, resp.StatusCode, string(data))
klog.Error(req.Method, req.URL, resp.StatusCode, string(data))
return Error{resp.StatusCode, string(data)}
}

View File

@@ -1 +1,40 @@
package kubesphere
import "github.com/spf13/pflag"
type KubeSphereOptions struct {
APIServer string
AccountServer string
}
// NewKubeSphereOptions create a default options
func NewKubeSphereOptions() *KubeSphereOptions {
return &KubeSphereOptions{
APIServer: "http://ks-apiserver.kubesphere-system.svc",
AccountServer: "http://ks-account.kubesphere-system.svc",
}
}
func (s *KubeSphereOptions) ApplyTo(options *KubeSphereOptions) {
if s.AccountServer != "" {
options.AccountServer = s.AccountServer
}
if s.APIServer != "" {
options.APIServer = s.APIServer
}
}
func (s *KubeSphereOptions) Validate() []error {
errs := []error{}
return errs
}
func (s *KubeSphereOptions) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&s.APIServer, "kubesphere-apiserver-host", s.APIServer, ""+
"KubeSphere apiserver host address.")
fs.StringVar(&s.AccountServer, "kubesphere-account-host", s.AccountServer, ""+
"KubeSphere account server host address.")
}

View File

@@ -14,7 +14,7 @@ limitations under the License.
package mysql
import (
"github.com/golang/glog"
"k8s.io/klog"
)
// EventReceiver is a sentinel EventReceiver; use it if the caller doesn't supply one
@@ -38,8 +38,8 @@ func (n *EventReceiver) EventErr(eventName string, err error) error {
// EventErrKv receives a notification of an error if one occurs along with
// optional key/value data
func (n *EventReceiver) EventErrKv(eventName string, err error, kvs map[string]string) error {
glog.Errorf("%+v", err)
glog.Errorf("%s: %+v", eventName, kvs)
klog.Errorf("%+v", err)
klog.Errorf("%s: %+v", eventName, kvs)
return err
}
@@ -51,5 +51,5 @@ func (n *EventReceiver) Timing(eventName string, nanoseconds int64) {
// TimingKv receives the time an event took to happen along with optional key/value data
func (n *EventReceiver) TimingKv(eventName string, nanoseconds int64, kvs map[string]string) {
// TODO: Change logger level to debug
glog.Infof("%s spend %.2fms: %+v", eventName, float32(nanoseconds)/1000000, kvs)
klog.Infof("%s spend %.2fms: %+v", eventName, float32(nanoseconds)/1000000, kvs)
}

View File

@@ -20,8 +20,8 @@ package openpitrix
import (
"encoding/json"
"fmt"
"github.com/golang/glog"
"io/ioutil"
"k8s.io/klog"
"net/http"
"strconv"
"strings"
@@ -38,14 +38,14 @@ func (c *OpenPitrixClient) GetAppInfo(appId string) (string, string, string, err
url := fmt.Sprintf("%s/v1/apps?app_id=%s", c.apiServer, appId)
resp, err := c.makeHttpRequest("GET", url, "")
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, Unknown, Unknown, err
}
var apps appList
err = json.Unmarshal(resp, &apps)
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, Unknown, Unknown, err
}
@@ -61,7 +61,7 @@ func (c *OpenPitrixClient) GetCluster(clusterId string) (*Cluster, error) {
resp, err := c.makeHttpRequest("GET", url, "")
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -69,7 +69,7 @@ func (c *OpenPitrixClient) GetCluster(clusterId string) (*Cluster, error) {
err = json.Unmarshal(resp, &clusterList)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -102,7 +102,7 @@ func (c *OpenPitrixClient) ListClusters(runtimeId, searchWord, status string, li
resp, err := c.makeHttpRequest("GET", url, "")
if err != nil {
glog.Errorf("request %s failed, reason: %s", url, err)
klog.Errorf("request %s failed, reason: %s", url, err)
return nil, err
}
@@ -120,14 +120,14 @@ func (c *OpenPitrixClient) GetRepo(repoId string) (string, error) {
url := fmt.Sprintf("%s/v1/repos?repo_id=%s", c.apiServer, repoId)
resp, err := c.makeHttpRequest("GET", url, "")
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, err
}
var repos repoList
err = json.Unmarshal(resp, &repos)
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, err
}
@@ -142,14 +142,14 @@ func (c *OpenPitrixClient) GetVersion(versionId string) (string, error) {
versionUrl := fmt.Sprintf("%s/v1/app_versions?version_id=%s", c.apiServer, versionId)
resp, err := c.makeHttpRequest("GET", versionUrl, "")
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, err
}
var versions VersionList
err = json.Unmarshal(resp, &versions)
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, err
}
@@ -164,14 +164,14 @@ func (c *OpenPitrixClient) GetRuntime(runtimeId string) (string, error) {
versionUrl := fmt.Sprintf("%s/v1/runtimes?runtime_id=%s", c.apiServer, runtimeId)
resp, err := c.makeHttpRequest("GET", versionUrl, "")
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, err
}
var runtimes runtimeList
err = json.Unmarshal(resp, &runtimes)
if err != nil {
glog.Error(err)
klog.Error(err)
return Unknown, err
}
@@ -189,14 +189,14 @@ func (c *OpenPitrixClient) CreateCluster(request CreateClusterRequest) error {
data, err := json.Marshal(request)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
data, err = c.makeHttpRequest("POST", versionUrl, string(data))
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
@@ -210,14 +210,14 @@ func (c *OpenPitrixClient) DeleteCluster(request DeleteClusterRequest) error {
data, err := json.Marshal(request)
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
data, err = c.makeHttpRequest("POST", versionUrl, string(data))
if err != nil {
glog.Error(err)
klog.Error(err)
return err
}
@@ -237,7 +237,7 @@ func (c *OpenPitrixClient) makeHttpRequest(method, url, data string) ([]byte, er
req.Header.Add("Authorization", c.token)
if err != nil {
glog.Error(err)
klog.Error(err)
return nil, err
}
@@ -245,7 +245,7 @@ func (c *OpenPitrixClient) makeHttpRequest(method, url, data string) ([]byte, er
if err != nil {
err := fmt.Errorf("Request to %s failed, method: %s,token: %s, reason: %s ", url, method, c.apiServer, err)
glog.Error(err)
klog.Error(err)
return nil, err
}

View File

@@ -18,8 +18,8 @@
package prometheus
import (
"github.com/golang/glog"
"io/ioutil"
"k8s.io/klog"
"net/http"
"time"
)
@@ -52,14 +52,14 @@ func (c *PrometheusClient) sendMonitoringRequest(endpoint string, queryType stri
epurl := endpoint + queryType + params
response, err := c.client.Get(epurl)
if err != nil {
glog.Error(err)
klog.Error(err)
} else {
defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)
if err != nil {
glog.Error(err)
klog.Error(err)
}
return string(contents)
}

View File

@@ -9,8 +9,8 @@ import (
type S3Options struct {
Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"`
Region string `json:"region,omitempty" yaml:"region,omitempty"`
DisableSSL bool `json:"disableSSL,omitempty" yaml:"disableSSL,omitempty"`
ForcePathStyle bool `json:"forcePathStyle,omitempty" yaml:"forePathStyle,omitempty"`
DisableSSL bool `json:"disableSSL" yaml:"disableSSL"`
ForcePathStyle bool `json:"forcePathStyle" yaml:"forePathStyle"`
AccessKeyID string `json:"accessKeyID,omitempty" yaml:"accessKeyID,omitempty"`
SecretAccessKey string `json:"secretAccessKey,omitempty" yaml:"secretAccessKey,omitempty"`
SessionToken string `json:"sessionToken,omitempty" yaml:"sessionToken,omitempty"`