From 7aa4028711ea6b2b08f9d3bdcb2bff8d46dd1493 Mon Sep 17 00:00:00 2001 From: duanliguo Date: Thu, 2 Feb 2023 14:40:50 +0800 Subject: [PATCH] Update bos features and add eccr --- README.md | 2 + bce/config.go | 2 +- doc/ECCR.md | 282 +++++++++++++++++++++++++++++++++++ http/constants.go | 1 + init.go | 1 + services/bos/api/bucket.go | 9 +- services/bos/api/util.go | 2 + services/bos/client.go | 21 ++- services/eccr/api.go | 79 ++++++++++ services/eccr/client.go | 43 ++++++ services/eccr/client_test.go | 122 +++++++++++++++ services/eccr/model.go | 75 ++++++++++ services/scs/model.go | 1 - 13 files changed, 632 insertions(+), 8 deletions(-) create mode 100644 doc/ECCR.md create mode 100644 services/eccr/api.go create mode 100644 services/eccr/client.go create mode 100644 services/eccr/client_test.go create mode 100644 services/eccr/model.go diff --git a/README.md b/README.md index b20f49b..5652712 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ bce-sdk-go | |--csn //云智能网 | |--ddc //DDC数据库专属集群 | |--dts //数据传输服务 +| |--eccr //容器镜像服务企业版 | |--eip //弹性公网IP | |--endpoint //SNIC服务网卡 | |--eni //ENIC弹性网卡 @@ -254,6 +255,7 @@ SSL证书服务 | CERT | github.com/baidubce/bce-sdk-go/services/cert 云智能网 | CSN | github.com/baidubce/bce-sdk-go/services/csn | [CSN.md](./doc/CSN.md) 文档服务 | DOC | github.com/baidubce/bce-sdk-go/services/doc | [DOC.md](./doc/DOC.md) 数据传输服务 | DTS | github.com/baidubce/bce-sdk-go/services/dts | [DTS.md](./doc/DTS.md) +容器镜像服务 企业版 | ECCR | github.com/baidubce/bce-sdk-go/services/eccr | [ECCR.md](./doc/ECCR.md) 弹性公网IP | EIP | github.com/baidubce/bce-sdk-go/services/eip | [EIP.md](./doc/EIP.md) ENIC弹性网卡 | ENIC | github.com/baidubce/bce-sdk-go/services/eni | [ENIC.md](./doc/ENIC.md) 企业安全组 | ESG | github.com/baidubce/bce-sdk-go/services/esg | [ESG.md](./doc/ESG.md) diff --git a/bce/config.go b/bce/config.go index 346b06c..51a476e 100644 --- a/bce/config.go +++ b/bce/config.go @@ -26,7 +26,7 @@ import ( // Constants and default values for the package bce const ( - SDK_VERSION = "0.9.141" + SDK_VERSION = "0.9.142" URI_PREFIX = "/" // now support uri without prefix "v1" so just set root path DEFAULT_DOMAIN = "baidubce.com" DEFAULT_PROTOCOL = "http" diff --git a/doc/ECCR.md b/doc/ECCR.md new file mode 100644 index 0000000..8d00960 --- /dev/null +++ b/doc/ECCR.md @@ -0,0 +1,282 @@ +# CCR服务 企业版 + +# 概述 + +本文档主要介绍CCR企业版 GO SDK的使用。在使用本文档前,您需要先了解CCR的一些基本知识,并已开通了CCR服务。若您还不了解CCR,可以参考[产品描述](https://cloud.baidu.com/doc/CCR/s/qk8gwqs4a)和[操作指南](https://cloud.baidu.com/doc/CCR/s/skw63yms7)。 + +# 初始化 + +## 确认Endpoint + +在确认您使用SDK时配置的Endpoint时,可先阅读开发人员指南中关于[CCR服务域名](https://cloud.baidu.com/doc/CCR/s/Fjwvy1fl4)的部分,理解Endpoint相关的概念。百度云目前开放了多区域支持,请参考[区域选择说明](https://cloud.baidu.com/doc/CCR/s/Fjwvy1fl4)。 + +目前支持“华北-北京”、“华南-广州”、“华东-苏州”、“香港”、“金融华中-武汉”和“华北-保定”六个区域。对应信息为: + +访问区域 | 对应Endpoint | 协议 +---|----------------------|--- +BJ | ccr.bj.baidubce.com | HTTP and HTTPS +GZ | ccr.gz.baidubce.com | HTTP and HTTPS +SU | ccr.su.baidubce.com | HTTP and HTTPS +HKG| ccr.hkg.baidubce.com | HTTP and HTTPS +FWH| ccr.fwh.baidubce.com | HTTP and HTTPS +BD | ccr.bd.baidubce.com | HTTP and HTTPS + +## 获取密钥 + +要使用百度云CCR,您需要拥有一个有效的AK(Access Key ID)和SK(Secret Access Key)用来进行签名认证。AK/SK是由系统分配给用户的,均为字符串,用于标识用户,为访问CCR做签名验证。 + +可以通过如下步骤获得并了解您的AK/SK信息: + +[注册百度云账号](https://login.bce.baidu.com/reg.html?tpl=bceplat&from=portal) + +[创建AK/SK](https://console.bce.baidu.com/iam/?_=1513940574695#/iam/accesslist) + +## 新建CCR Client + +CCR企业版 Client是CCR服务的客户端,为开发者与CCR服务进行交互提供了一系列的方法。 + +### 使用AK/SK新建CCR Client + +通过AK/SK方式访问CCR,用户可以参考如下代码新建一个CCR Client: +```go +import ( + "github.com/baidubce/bce-sdk-go/services/eccr" +) + +func main() { + // 用户的Access Key ID和Secret Access Key + AK, SK := , + + //用户指定的endpoint + ENDPOINT := "endpoint" + + // 初始化一个CCRClient + ccrClient, err := eccr.NewClient(AK, SK, ENDPOINT) +} +``` + +在上面代码中,`AK`对应控制台中的“Access Key ID”,`SK`对应控制台中的“Access Key Secret”,获取方式请参考《操作指南 [如何获取AKSK](https://cloud.baidu.com/doc/Reference/s/9jwvz2egb/)》。第三个参数`ENDPOINT`支持用户自己指定域名,如果设置为空字符串,会使用默认域名作为CCR的服务地址。 + +> **注意:**`ENDPOINT`参数需要用指定区域的域名来进行定义,如服务所在区域为北京,则为`ccr.bj.baidubce.com`。 + +### 使用STS创建CCR Client + +**申请STS token** + +CCR可以通过STS机制实现第三方的临时授权访问。STS(Security Token Service)是百度云提供的临时授权服务。通过STS,您可以为第三方用户颁发一个自定义时效和权限的访问凭证。第三方用户可以使用该访问凭证直接调用百度云的API或SDK访问百度云资源。 + +通过STS方式访问CCR,用户需要先通过STS的client申请一个认证字符串。 + +**用STS token新建CCR Client** + +申请好STS后,可将STS Token配置到CCR Client中,从而实现通过STS Token创建CCR Client。 + +**代码示例** + +GO SDK实现了STS服务的接口,用户可以参考如下完整代码,实现申请STS Token和创建CCR Client对象: +```go +import ( + "fmt" + + "github.com/baidubce/bce-sdk-go/auth" //导入认证模块 + "github.com/baidubce/bce-sdk-go/services/eccr" //导入CCR服务模块 + "github.com/baidubce/bce-sdk-go/services/sts" //导入STS服务模块 +) + +func main() { + // 创建STS服务的Client对象,Endpoint使用默认值 + AK, SK := , + stsClient, err := sts.NewClient(AK, SK) + if err != nil { + fmt.Println("create sts client object :", err) + return + } + + // 获取临时认证token,有效期为60秒,ACL为空 + stsObj, err := stsClient.GetSessionToken(60, "") + if err != nil { + fmt.Println("get session token failed:", err) + return + } + fmt.Println("GetSessionToken result:") + fmt.Println(" accessKeyId:", stsObj.AccessKeyId) + fmt.Println(" secretAccessKey:", stsObj.SecretAccessKey) + fmt.Println(" sessionToken:", stsObj.SessionToken) + fmt.Println(" createTime:", stsObj.CreateTime) + fmt.Println(" expiration:", stsObj.Expiration) + fmt.Println(" userId:", stsObj.UserId) + + // 使用申请的临时STS创建CCR服务的Client对象,Endpoint使用默认值 + ccrClient, err := eccr.NewClient(stsObj.AccessKeyId, stsObj.SecretAccessKey, "ccr.bj.baidubce.com") + if err != nil { + fmt.Println("create ccr client failed:", err) + return + } + stsCredential, err := auth.NewSessionBceCredentials( + stsObj.AccessKeyId, + stsObj.SecretAccessKey, + stsObj.SessionToken) + if err != nil { + fmt.Println("create sts credential object failed:", err) + return + } + ccrClient.Config.Credentials = stsCredential +} +``` + +> 注意: +> 目前使用STS配置CCR Client时,无论对应CCR服务的Endpoint在哪里,STS的Endpoint都需配置为http://sts.bj.baidubce.com。上述代码中创建STS对象时使用此默认值。 + +# 配置HTTPS协议访问CCR + +CCR支持HTTPS传输协议,您可以通过在创建CCR Client对象时指定的Endpoint中指明HTTPS的方式,在CCR GO SDK中使用HTTPS访问CCR企业版服务: +```go +// import "github.com/baidubce/bce-sdk-go/services/ccr" +AK, SK := , +ENDPOINT := "https://ccr.bj.baidubce.com" //指明使用HTTPS协议 + +ccrClient, _ := eccr.NewClient(AK, SK, ENDPOINT) +``` + +## 配置CCR Client + +如果用户需要配置CCR Client的一些细节的参数,可以在创建CCR Client对象之后,使用该对象的导出字段`Config`进行自定义配置,可以为客户端配置代理,最大连接数等参数。 + +### 使用代理 + +下面一段代码可以让客户端使用代理访问CCR服务: + +```go +// import "github.com/baidubce/bce-sdk-go/services/ccr" + +//创建CCR Client对象 +AK, SK := , +ENDPOINT := "ccr.bj.baidubce.com" + +ccrClient, _ := eccr.NewClient(AK, SK, ENDPOINT) + +//代理使用本地的8080端口 +ccrClient.Config.ProxyUrl = "127.0.0.1:8080" +``` + +### 设置网络参数 + +用户可以通过如下的示例代码进行网络参数的设置: + +```go +// import "github.com/baidubce/bce-sdk-go/services/ccr" + +AK, SK := , +ENDPOINT := "ccr.bj.baidubce.com" + +ccrClient, _ := eccr.NewClient(AK, SK, ENDPOINT) + +// 配置不进行重试,默认为Back Off重试 +ccrClient.Config.Retry = bce.NewNoRetryPolicy() + +// 配置连接超时时间为30秒 +ccrClient.Config.ConnectionTimeoutInMillis = 30 * 1000 +``` + +### 配置生成签名字符串选项 + +```go +// import "github.com/baidubce/bce-sdk-go/services/ccr" + +AK, SK := , +ENDPOINT := "ccr.bj.baidubce.com" + +ccrClient, _ := eccr.NewClient(AK, SK, ENDPOINT) + +// 配置签名使用的HTTP请求头为`Host` +headersToSign := map[string]struct{}{"Host": struct{}{}} +ccrClient.Config.SignOption.HeadersToSign = HeadersToSign + +// 配置签名的有效期为30秒 +ccrClient.Config.SignOption.ExpireSeconds = 30 +``` + +**参数说明** + +用户使用GO SDK访问CCR时,创建的CCR Client对象的`Config`字段支持的所有参数如下表所示: + +配置项名称 | 类型 | 含义 +-----------|---------|-------- +Endpoint | string | 请求服务的域名 +ProxyUrl | string | 客户端请求的代理地址 +Region | string | 请求资源的区域 +UserAgent | string | 用户名称,HTTP请求的User-Agent头 +Credentials| \*auth.BceCredentials | 请求的鉴权对象,分为普通AK/SK与STS两种 +SignOption | \*auth.SignOptions | 认证字符串签名选项 +Retry | RetryPolicy | 连接重试策略 +ConnectionTimeoutInMillis| int | 连接超时时间,单位毫秒,默认20分钟 + +说明: + +1. `Credentials`字段使用`auth.NewBceCredentials`与`auth.NewSessionBceCredentials`函数创建,默认使用前者,后者为使用STS鉴权时使用,详见“使用STS创建CCR Client”小节。 +2. `SignOption`字段为生成签名字符串时的选项,详见下表说明: + +名称 | 类型 | 含义 +--------------|-------|----------- +HeadersToSign |map[string]struct{} | 生成签名字符串时使用的HTTP头 +Timestamp | int64 | 生成的签名字符串中使用的时间戳,默认使用请求发送时的值 +ExpireSeconds | int | 签名字符串的有效期 + + 其中,HeadersToSign默认为`Host`,`Content-Type`,`Content-Length`,`Content-MD5`;TimeStamp一般为零值,表示使用调用生成认证字符串时的时间戳,用户一般不应该明确指定该字段的值;ExpireSeconds默认为1800秒即30分钟。 +3. `Retry`字段指定重试策略,目前支持两种:`NoRetryPolicy`和`BackOffRetryPolicy`。默认使用后者,该重试策略是指定最大重试次数、最长重试时间和重试基数,按照重试基数乘以2的指数级增长的方式进行重试,直到达到最大重试测试或者最长重试时间为止。 + + +# CCR管理 + +百度智能云容器镜像服务(Cloud Container Registry,简称CCR)是面向容器镜像、Helm Chart等符合OCI规范的云原生制品安全托管以及高效分发平台。CCR支持在多个地域创建独享托管服务,具备多种安全保障;支持同步容器镜像等云原生制品,与容器引擎CCE等服务无缝集成,助力企业提升云原生容器应用交付效率。 + +> 注意: +> - 企业版实例托管的云原生应用制品(如容器镜像、Helm Chart)存储在您的 BOS Bucket 中,根据实际使用情况将产生存储和流量费用。 + +## 列举CCR实例 +使用以下代码可以列举CCR实例列表。 +```go +args := &ListInstancesArgs{ + KeywordType: "clusterName", + Keyword: "", + PageNo: 1, + PageSize: 10, + } + +resp, err := ccrClient.ListInstances(args) +if err != nil { + fmt.Println(err.Error()) + return +} + +s, _ := json.MarshalIndent(resp, "", "\t") +fmt.Println("Response:"+ string(s)) +``` + +## 查询单个CCR实例详情 +列举CCR实例列表。 +```go +instanceID := "instance-id" +resp, err := ccrClient.GetInstanceDetail(instanceID) +if err != nil { + fmt.Println(err.Error()) + return +} + +s, _ := json.MarshalIndent(resp, "", "\t") +fmt.Println("Response:" + string(s)) +``` + +## 获取私有网络列表 +查询私有网络列表。 +```go +instanceID := "instance-id" +resp, err := ccrClient.ListPrivateNetworks(instanceID) +if err != nil { + fmt.Println(err.Error()) + return +} + +s, _ := json.MarshalIndent(resp, "", "\t") +fmt.Println("Response:" + string(s)) +``` \ No newline at end of file diff --git a/http/constants.go b/http/constants.go index 2f9a1e1..8a859b4 100644 --- a/http/constants.go +++ b/http/constants.go @@ -81,4 +81,5 @@ const ( BCE_FORBID_OVERWRITE = "x-bce-forbid-overwrite" BCE_SYMLINK_TARGET = "x-bce-symlink-target" BCE_TRAFFIC_LIMIT = "x-bce-traffic-limit" + BCE_BUCKET_TYPE = "x-bce-bucket-type" ) diff --git a/init.go b/init.go index 97cb7aa..28b61bb 100644 --- a/init.go +++ b/init.go @@ -36,6 +36,7 @@ import ( _ "github.com/baidubce/bce-sdk-go/services/dcc" _ "github.com/baidubce/bce-sdk-go/services/ddc" _ "github.com/baidubce/bce-sdk-go/services/ddc/v2" + _ "github.com/baidubce/bce-sdk-go/services/eccr" _ "github.com/baidubce/bce-sdk-go/services/eip" _ "github.com/baidubce/bce-sdk-go/services/etGateway" _ "github.com/baidubce/bce-sdk-go/services/iam" diff --git a/services/bos/api/bucket.go b/services/bos/api/bucket.go index 9046364..261ac06 100644 --- a/services/bos/api/bucket.go +++ b/services/bos/api/bucket.go @@ -106,21 +106,22 @@ func ListObjects(cli bce.Client, bucket string, // - bucket: the bucket name // RETURNS: // - error: nil if exists and have authority otherwise the specific error -func HeadBucket(cli bce.Client, bucket string) error { +func HeadBucket(cli bce.Client, bucket string) (error, *bce.BceResponse) { req := &bce.BceRequest{} req.SetUri(getBucketUri(bucket)) req.SetMethod(http.HEAD) resp := &bce.BceResponse{} if err := SendRequest(cli, req, resp); err != nil { - return err + return err, resp } if resp.IsFail() { - return resp.ServiceError() + return resp.ServiceError(), resp } defer func() { resp.Body().Close() }() - return nil + return nil, resp } + // PutBucket - create a new bucket with the given name // // PARAMS: diff --git a/services/bos/api/util.go b/services/bos/api/util.go index d5ce8bc..11cbcde 100644 --- a/services/bos/api/util.go +++ b/services/bos/api/util.go @@ -59,6 +59,8 @@ const ( FORBID_OVERWRITE_FALSE = "false" FORBID_OVERWRITE_TRUE = "true" + + NAMESPACE_BUCKET = "namespace" ) var DEFAULT_CNAME_LIKE_LIST = []string{ diff --git a/services/bos/client.go b/services/bos/client.go index b449a86..64616c4 100644 --- a/services/bos/client.go +++ b/services/bos/client.go @@ -28,6 +28,7 @@ import ( "github.com/baidubce/bce-sdk-go/auth" "github.com/baidubce/bce-sdk-go/bce" + sdk_http "github.com/baidubce/bce-sdk-go/http" "github.com/baidubce/bce-sdk-go/services/bos/api" "github.com/baidubce/bce-sdk-go/services/sts" "github.com/baidubce/bce-sdk-go/util/log" @@ -183,7 +184,8 @@ func (c *Client) SimpleListObjects(bucket, prefix string, maxKeys int, marker, // RETURNS: // - error: nil if exists and have authority otherwise the specific error func (c *Client) HeadBucket(bucket string) error { - return api.HeadBucket(c, bucket) + err, _ := api.HeadBucket(c, bucket) + return err } // DoesBucketExist - test the given bucket existed or not @@ -194,7 +196,7 @@ func (c *Client) HeadBucket(bucket string) error { // - bool: true if exists and false if not exists or occurs error // - error: nil if exists or not exist, otherwise the specific error func (c *Client) DoesBucketExist(bucket string) (bool, error) { - err := api.HeadBucket(c, bucket) + err, _ := api.HeadBucket(c, bucket) if err == nil { return true, nil } @@ -209,6 +211,21 @@ func (c *Client) DoesBucketExist(bucket string) (bool, error) { return false, err } +//IsNsBucket - test the given bucket is namespace bucket or not +func (c *Client) IsNsBucket(bucket string) bool { + err, resp := api.HeadBucket(c, bucket) + if err == nil && resp.Header(sdk_http.BCE_BUCKET_TYPE) == api.NAMESPACE_BUCKET { + return true + } + if realErr, ok := err.(*bce.BceServiceError); ok { + if realErr.StatusCode == http.StatusForbidden && + resp.Header(sdk_http.BCE_BUCKET_TYPE) == api.NAMESPACE_BUCKET { + return true + } + } + return false +} + // PutBucket - create a new bucket // // PARAMS: diff --git a/services/eccr/api.go b/services/eccr/api.go new file mode 100644 index 0000000..5b6e3da --- /dev/null +++ b/services/eccr/api.go @@ -0,0 +1,79 @@ +package eccr + +import ( + "strconv" + + "github.com/baidubce/bce-sdk-go/bce" + "github.com/baidubce/bce-sdk-go/http" +) + +type Interface interface { + ListInstances(args *ListInstancesArgs) (*ListInstancesResponse, error) + GetInstanceDetail(instanceID string) (*GetInstanceDetailResponse, error) + ListPrivateNetworks(instanceID string) (*ListPrivateNetworksResponse, error) +} + +// ListInstances - list all instance with the specific parameters +// +// PARAMS: +// - ListInstancesArgs: the arguments to list all instance +// +// RETURNS: +// - ListInstancesResponse: the result of list Instance +// - error: nil if success otherwise the specific error +func (c *Client) ListInstances(args *ListInstancesArgs) (*ListInstancesResponse, error) { + + result := &ListInstancesResponse{} + err := bce.NewRequestBuilder(c). + WithMethod(http.GET). + WithURL(getInstanceListURI()). + WithQueryParamFilter("keywordType", args.KeywordType). + WithQueryParamFilter("keyword", args.Keyword). + WithQueryParamFilter("pageNo", strconv.Itoa(args.PageNo)). + WithQueryParamFilter("pageSize", strconv.Itoa(args.PageSize)). + WithQueryParamFilter("acrossregion", args.Acrossregion). + WithResult(result). + Do() + + return result, err +} + +// GetInstanceDetail - get a specific instance detail info +// +// PARAMS: +// - instanceID: the specific instance ID +// +// RETURNS: +// - *GetInstanceDetailResponse: the result of get instance detail info +// - error: nil if success otherwise the specific error +func (c *Client) GetInstanceDetail(instanceID string) (*GetInstanceDetailResponse, error) { + + result := &GetInstanceDetailResponse{} + err := bce.NewRequestBuilder(c). + WithMethod(http.GET). + WithURL(getInstanceURI(instanceID)). + WithResult(result). + Do() + + return result, err +} + +// ListPrivateNetworks - list all Privatelinks in an instance with the specific parameters +// +// PARAMS: +// - instanceID: the specific instance ID +// +// RETURNS: +// - *ListPrivateNetworksResponse: the result of list Privatelinks +// - error: nil if success otherwise the specific error +func (c *Client) ListPrivateNetworks(instanceID string) (*ListPrivateNetworksResponse, error) { + + result := &ListPrivateNetworksResponse{} + err := bce.NewRequestBuilder(c). + WithMethod(http.GET). + WithURL(getPrivateNetworkListResponseURI(instanceID)). + WithResult(result). + Do() + + return result, err +} diff --git a/services/eccr/client.go b/services/eccr/client.go new file mode 100644 index 0000000..5e735bb --- /dev/null +++ b/services/eccr/client.go @@ -0,0 +1,43 @@ +package eccr + +import ( + "github.com/baidubce/bce-sdk-go/bce" +) + +const ( + DEFAULT_ENDPOINT = "ccr." + bce.DEFAULT_REGION + ".baidubce.com" + + URI_PREFIX = bce.URI_PREFIX + "api/ccr/esvc/v1" + + REQUEST_INSTANCE_URL = "/instances" + + REQUEST_PRIVATELINK_URL = "/privatelinks" +) + +// Client ccr enterprise interface.Interface +type Client struct { + *bce.BceClient +} + +func NewClient(ak, sk, endPoint string) (*Client, error) { + if len(endPoint) == 0 { + endPoint = DEFAULT_ENDPOINT + } + client, err := bce.NewBceClientWithAkSk(ak, sk, endPoint) + if err != nil { + return nil, err + } + return &Client{client}, nil +} + +func getInstanceListURI() string { + return URI_PREFIX + REQUEST_INSTANCE_URL +} + +func getInstanceURI(instanceID string) string { + return URI_PREFIX + REQUEST_INSTANCE_URL + "/" + instanceID +} + +func getPrivateNetworkListResponseURI(instanceID string) string { + return URI_PREFIX + REQUEST_INSTANCE_URL + "/" + instanceID + REQUEST_PRIVATELINK_URL +} diff --git a/services/eccr/client_test.go b/services/eccr/client_test.go new file mode 100644 index 0000000..171390f --- /dev/null +++ b/services/eccr/client_test.go @@ -0,0 +1,122 @@ +package eccr + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "reflect" + "runtime" + "testing" + + "github.com/baidubce/bce-sdk-go/util/log" +) + +var ( + CCR_CLIENT *Client + CCR_INSTANCE_ID string +) + +// For security reason, ak/sk should not hard write here. +type Conf struct { + AK string + SK string + Endpoint string +} + +func TestMain(m *testing.M) { + setup() + code := m.Run() + os.Exit(code) +} + +func setup() { + _, f, _, _ := runtime.Caller(0) + for i := 0; i < 7; i++ { + f = filepath.Dir(f) + } + conf := filepath.Join(f, "config.json") + fmt.Println(conf) + fp, err := os.Open(conf) + if err != nil { + log.Fatal("config json file of ak/sk not given:", conf) + os.Exit(1) + } + decoder := json.NewDecoder(fp) + confObj := &Conf{} + if err := decoder.Decode(confObj); err != nil { + log.Fatal("decode config obj err:", err) + os.Exit(1) + } + + log.SetLogLevel(log.WARN) + + CCR_CLIENT, err = NewClient(confObj.AK, confObj.SK, confObj.Endpoint) + if err != nil { + log.Fatal(err) + } + + log.Info("Setup Complete") +} + +// ExpectEqual is the helper function for test each case +func ExpectEqual(alert func(format string, args ...interface{}), + expected interface{}, actual interface{}) bool { + expectedValue, actualValue := reflect.ValueOf(expected), reflect.ValueOf(actual) + equal := false + switch { + case expected == nil && actual == nil: + return true + case expected != nil && actual == nil: + equal = expectedValue.IsNil() + case expected == nil && actual != nil: + equal = actualValue.IsNil() + default: + if actualType := reflect.TypeOf(actual); actualType != nil { + if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { + equal = reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) + } + } + } + if !equal { + _, file, line, _ := runtime.Caller(1) + alert("%s:%d: missmatch, expect %v but %v", file, line, expected, actual) + return false + } + return true +} + +func TestClient_ListInstances(t *testing.T) { + args := &ListInstancesArgs{ + KeywordType: "clusterName", + Keyword: "", + PageNo: 1, + PageSize: 10, + } + resp, err := CCR_CLIENT.ListInstances(args) + + ExpectEqual(t.Errorf, nil, err) + + s, _ := json.MarshalIndent(resp, "", "\t") + fmt.Println("Response:" + string(s)) +} + +func TestClient_GetInstanceDetail(t *testing.T) { + + resp, err := CCR_CLIENT.GetInstanceDetail(CCR_INSTANCE_ID) + + ExpectEqual(t.Errorf, nil, err) + + s, _ := json.MarshalIndent(resp, "", "\t") + fmt.Println("Response:" + string(s)) +} + +func TestClient_ListPrivateNetworks(t *testing.T) { + + resp, err := CCR_CLIENT.ListPrivateNetworks(CCR_INSTANCE_ID) + + ExpectEqual(t.Errorf, nil, err) + + s, _ := json.MarshalIndent(resp, "", "\t") + fmt.Println("Response:" + string(s)) +} diff --git a/services/eccr/model.go b/services/eccr/model.go new file mode 100644 index 0000000..7474571 --- /dev/null +++ b/services/eccr/model.go @@ -0,0 +1,75 @@ +package eccr + +import "time" + +type PagedListOption struct { + PageNo int + PageSize int + KeywordType string + Keyword string +} + +type PageInfo struct { + Total int `json:"total"` + PageNo int `json:"pageNo"` + PageSize int `json:"pageSize"` +} + +type ListInstancesArgs struct { + PageNo int + PageSize int + KeywordType string + Keyword string + Acrossregion string +} + +type ListInstancesResponse struct { + PageInfo `json:",inline"` + Instances []*InstanceInfo `json:"instances"` +} + +type InstanceInfo struct { + ID string `json:"id"` + InstanceType string `json:"instanceType"` + Name string `json:"name"` + Status string `json:"status"` + CreateTime time.Time `json:"createTime"` + Region string `json:"region"` + PublicURL string `json:"publicURL"` + ExpireTime time.Time `json:"expireTime"` +} + +type InstanceStatistic struct { + Repo int64 `json:"repo"` + Chart int64 `json:"chart"` + Namespace int64 `json:"namespace"` + Storage int64 `json:"storage"` +} + +type UserQuota struct { + Repo int64 `json:"repo"` + Chart int64 `json:"chart"` + Namespace int64 `json:"namespace"` +} + +type GetInstanceDetailResponse struct { + Info *InstanceInfo `json:"info,omitempty"` + Statistic InstanceStatistic `json:"statistic,omitempty"` + Quota UserQuota `json:"quota,omitempty"` + Bucket string `json:"bucket,omitempty"` + Region string `json:"region,omitempty"` +} + +type ListPrivateNetworksResponse struct { + Domain string `json:"domain"` + Items []PrivateNetworksItems `json:"items"` +} + +type PrivateNetworksItems struct { + VpcID string `json:"vpcID,omitempty"` + SubnetID string `json:"subnetID,omitempty"` + ServiceNetID string `json:"serviceNetID,omitempty"` + Status string `json:"status,omitempty"` + IPAddress string `json:"ipAddress,omitempty"` + ResourceSource string `json:"resourceSource,omitempty"` +} diff --git a/services/scs/model.go b/services/scs/model.go index 5382166..93cbf0e 100644 --- a/services/scs/model.go +++ b/services/scs/model.go @@ -73,7 +73,6 @@ type InstanceModel struct { InstanceExpireTime string `json:"instanceExpireTime"` ShardNum int `json:"shardNum"` ReplicationNum int `json:"replicationNum"` - DiskFlavor int `json:"diskFlavor"` ClusterType string `json:"clusterType"` Engine string `json:"engine"` EngineVersion string `json:"engineVersion"`