You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by mi...@apache.org on 2023/03/06 10:00:41 UTC

[shardingsphere-on-cloud] branch main updated: feat(pitr):cli-agent api integration and add httputils,custome err (#245)

This is an automated email from the ASF dual-hosted git repository.

miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new 96a3bb7  feat(pitr):cli-agent api integration and add httputils,custome err (#245)
96a3bb7 is described below

commit 96a3bb74b1ca6531d8b38c7a1a3a48320f2d9ed6
Author: lltgo <ll...@foxmail.com>
AuthorDate: Mon Mar 6 18:00:36 2023 +0800

    feat(pitr):cli-agent api integration and add httputils,custome err (#245)
---
 pitr/cli/go.mod                                    |   1 +
 pitr/cli/go.sum                                    |   2 +
 pitr/cli/internal/pkg/agent-server.go              |  58 ++++++++++-
 .../pkg/{agent-server.go => agent-server_test.go}  |  27 +++++-
 .../pkg/{agent-server.go => model/as_backup.go}    |  26 ++++-
 .../internal/pkg/{agent-server.go => xerr/err.go}  |  32 +++++-
 pitr/cli/pkg/httputils/req.go                      | 107 +++++++++++++++++++++
 7 files changed, 247 insertions(+), 6 deletions(-)

diff --git a/pitr/cli/go.mod b/pitr/cli/go.mod
index a2234a3..72119b0 100644
--- a/pitr/cli/go.mod
+++ b/pitr/cli/go.mod
@@ -12,6 +12,7 @@ require (
 	github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
+	github.com/google/uuid v1.3.0 // indirect
 	github.com/inconshreveable/mousetrap v1.0.1 // indirect
 	github.com/onsi/ginkgo/v2 v2.8.3 // indirect
 	github.com/onsi/gomega v1.27.1 // indirect
diff --git a/pitr/cli/go.sum b/pitr/cli/go.sum
index 831a320..1928d7f 100644
--- a/pitr/cli/go.sum
+++ b/pitr/cli/go.sum
@@ -15,6 +15,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
 github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
diff --git a/pitr/cli/internal/pkg/agent-server.go b/pitr/cli/internal/pkg/agent-server.go
index a21fd42..5531b12 100644
--- a/pitr/cli/internal/pkg/agent-server.go
+++ b/pitr/cli/internal/pkg/agent-server.go
@@ -17,4 +17,60 @@
 
 package pkg
 
-//TODO
+import (
+	"context"
+	"fmt"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/xerr"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/httputils"
+	"github.com/google/uuid"
+	"net/http"
+)
+
+type agentServer struct {
+	addr string
+
+	_apiBackup     string
+	_apiRestore    string
+	_apiShowDetail string
+	_apiShowList   string
+}
+
+func NewAgentServer(addr string) *agentServer {
+	return &agentServer{
+		addr: addr,
+
+		_apiBackup:     "/api/backup",
+		_apiRestore:    "/api/restore",
+		_apiShowDetail: "/api/show",
+		_apiShowList:   "/api/show/list",
+	}
+}
+
+func (as *agentServer) Backup(in *model.BackupIn) (string, error) {
+	url := fmt.Sprintf("%s%s", as.addr, as._apiBackup)
+
+	out := &model.BackupOutResp{}
+	httpCode, err := httputils.NewRequest(context.Background(), http.MethodPost, url).
+		Header(map[string]string{
+			"x-request-id": uuid.New().String(),
+			"content-type": "application/json",
+		}).
+		Body(in).
+		Send(out)
+	if err != nil {
+		efmt := "httputils.NewRequest[url=%s,body=%v,out=%v] return err=%s,wrap=%w"
+		return "", fmt.Errorf(efmt, url, in, out, err, xerr.NewCliErr(xerr.Unknown))
+	}
+
+	if httpCode != http.StatusOK {
+		return "", fmt.Errorf("unknown http status[code=%d],err=%w", httpCode, xerr.NewCliErr(xerr.InvalidHttpStatus))
+	}
+
+	if out.Code != 0 {
+		asErr := xerr.NewAgentServerErr(out.Code, out.Msg)
+		return "", fmt.Errorf("agent server error[code=%d,msg=%s],err=%w", out.Code, out.Msg, asErr)
+	}
+
+	return out.Data.ID, nil
+}
diff --git a/pitr/cli/internal/pkg/agent-server.go b/pitr/cli/internal/pkg/agent-server_test.go
similarity index 57%
copy from pitr/cli/internal/pkg/agent-server.go
copy to pitr/cli/internal/pkg/agent-server_test.go
index a21fd42..218bd31 100644
--- a/pitr/cli/internal/pkg/agent-server.go
+++ b/pitr/cli/internal/pkg/agent-server_test.go
@@ -17,4 +17,29 @@
 
 package pkg
 
-//TODO
+import (
+	"fmt"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model"
+	"testing"
+)
+
+func TestAgentServer_Backup(t *testing.T) {
+	t.SkipNow()
+	//Note:just for test api,you need map you own host.
+	as := NewAgentServer("http://agent-server:18080")
+
+	backupID, err := as.Backup(&model.BackupIn{
+		DbPort:       5432,
+		DbName:       "omm",
+		Username:     "og",
+		Password:     "1234567890@SphereEx",
+		DnBackupPath: "/home/omm/data",
+		DnThreadsNum: 1,
+		DnBackupMode: "FULL",
+		Instance:     "ins-default-0",
+	})
+	if err != nil {
+		panic(err)
+	}
+	fmt.Println(backupID)
+}
diff --git a/pitr/cli/internal/pkg/agent-server.go b/pitr/cli/internal/pkg/model/as_backup.go
similarity index 57%
copy from pitr/cli/internal/pkg/agent-server.go
copy to pitr/cli/internal/pkg/model/as_backup.go
index a21fd42..e0cc1cf 100644
--- a/pitr/cli/internal/pkg/agent-server.go
+++ b/pitr/cli/internal/pkg/model/as_backup.go
@@ -15,6 +15,28 @@
 * limitations under the License.
  */
 
-package pkg
+package model
 
-//TODO
+type (
+	BackupIn struct {
+		DbPort   uint16 `json:"db_port"`
+		DbName   string `json:"db_name"`
+		Username string `json:"username"`
+		Password string `json:"password"`
+
+		DnBackupPath string `json:"dn_backup_path"`
+		DnThreadsNum uint8  `json:"dn_threads_num"`
+		DnBackupMode string `json:"dn_backup_mode"`
+		Instance     string `json:"instance"`
+	}
+
+	BackupOut struct {
+		ID string `json:"backup_id"`
+	}
+
+	BackupOutResp struct {
+		Code int       `json:"code" validate:"required"`
+		Msg  string    `json:"msg" validate:"required"`
+		Data BackupOut `json:"data"`
+	}
+)
diff --git a/pitr/cli/internal/pkg/agent-server.go b/pitr/cli/internal/pkg/xerr/err.go
similarity index 64%
copy from pitr/cli/internal/pkg/agent-server.go
copy to pitr/cli/internal/pkg/xerr/err.go
index a21fd42..d9302f8 100644
--- a/pitr/cli/internal/pkg/agent-server.go
+++ b/pitr/cli/internal/pkg/xerr/err.go
@@ -15,6 +15,34 @@
 * limitations under the License.
  */
 
-package pkg
+package xerr
 
-//TODO
+import "fmt"
+
+type (
+	service string
+	err     struct {
+		msg string
+	}
+)
+
+const (
+	Unknown           = "Unknown error"
+	InvalidHttpStatus = "Invalid http status"
+)
+
+func (e *err) Error() string {
+	return e.msg
+}
+
+func NewCliErr(msg string) error {
+	return &err{
+		msg: msg,
+	}
+}
+
+func NewAgentServerErr(code int, msg string) error {
+	return &err{
+		msg: fmt.Sprintf("agent server err[code=%d,msg=%s]", code, msg),
+	}
+}
diff --git a/pitr/cli/pkg/httputils/req.go b/pitr/cli/pkg/httputils/req.go
new file mode 100644
index 0000000..fc93c6c
--- /dev/null
+++ b/pitr/cli/pkg/httputils/req.go
@@ -0,0 +1,107 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+ */
+
+package httputils
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+)
+
+type req struct {
+	ctx    context.Context
+	method string
+	header map[string]string
+	url    string
+	body   any
+	query  map[string]string
+}
+
+func NewRequest(ctx context.Context, method, url string) *req {
+	r := &req{
+		ctx:    ctx,
+		method: method,
+		url:    url,
+	}
+	return r
+}
+
+func (r *req) Header(h map[string]string) *req {
+	r.header = h
+	return r
+}
+
+func (r *req) Body(b any) *req {
+	r.body = b
+	return r
+}
+
+func (r *req) Query(m map[string]string) *req {
+	r.query = m
+	return r
+}
+
+func (r *req) Send(body any) (int, error) {
+	var (
+		bs  []byte
+		err error
+	)
+
+	if r.body != nil {
+		bs, err = json.Marshal(r.body)
+		if err != nil {
+			return -1, fmt.Errorf("json.Marshal return err=%w", err)
+		}
+	}
+
+	_req, err := http.NewRequestWithContext(r.ctx, r.method, r.url, bytes.NewReader(bs))
+	if err != nil {
+		return -1, fmt.Errorf("new request failure,err=%w", err)
+	}
+
+	for k, v := range r.header {
+		_req.Header.Set(k, v)
+	}
+
+	for k, v := range r.query {
+		values := _req.URL.Query()
+		values.Add(k, v)
+		_req.URL.RawQuery = values.Encode()
+	}
+
+	c := &http.Client{}
+	resp, err := c.Do(_req)
+	if err != nil {
+		return -1, fmt.Errorf("http request err=%w", err)
+	}
+
+	all, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return -1, fmt.Errorf("invalid response,err=%w", err)
+	}
+	if body != nil {
+		if err = json.Unmarshal(all, body); err != nil {
+			return -1, fmt.Errorf("json unmarshal return err=%w", err)
+		}
+	}
+
+	return resp.StatusCode, nil
+}