2013-08-14 14:26:51 +08:00
|
|
|
package operation
|
|
|
|
|
|
|
|
import (
|
2018-11-23 16:26:15 +08:00
|
|
|
"context"
|
2015-03-09 16:10:01 +08:00
|
|
|
"fmt"
|
2018-11-21 03:35:45 +08:00
|
|
|
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
|
2019-02-15 16:09:19 +08:00
|
|
|
"github.com/chrislusf/seaweedfs/weed/security"
|
|
|
|
"github.com/chrislusf/seaweedfs/weed/util"
|
2019-02-20 17:01:01 +08:00
|
|
|
"google.golang.org/grpc"
|
|
|
|
"strings"
|
2013-08-14 14:26:51 +08:00
|
|
|
)
|
|
|
|
|
2016-06-26 10:50:18 +08:00
|
|
|
type VolumeAssignRequest struct {
|
|
|
|
Count uint64
|
|
|
|
Replication string
|
|
|
|
Collection string
|
|
|
|
Ttl string
|
|
|
|
DataCenter string
|
|
|
|
Rack string
|
|
|
|
DataNode string
|
|
|
|
}
|
|
|
|
|
2013-08-14 14:26:51 +08:00
|
|
|
type AssignResult struct {
|
2019-02-15 16:09:19 +08:00
|
|
|
Fid string `json:"fid,omitempty"`
|
|
|
|
Url string `json:"url,omitempty"`
|
|
|
|
PublicUrl string `json:"publicUrl,omitempty"`
|
|
|
|
Count uint64 `json:"count,omitempty"`
|
|
|
|
Error string `json:"error,omitempty"`
|
|
|
|
Auth security.EncodedJwt `json:"auth,omitempty"`
|
2013-08-14 14:26:51 +08:00
|
|
|
}
|
|
|
|
|
2019-02-19 04:11:52 +08:00
|
|
|
func Assign(server string, grpcDialOption grpc.DialOption, primaryRequest *VolumeAssignRequest, alternativeRequests ...*VolumeAssignRequest) (*AssignResult, error) {
|
2018-11-21 03:35:45 +08:00
|
|
|
|
2018-07-10 14:18:20 +08:00
|
|
|
var requests []*VolumeAssignRequest
|
|
|
|
requests = append(requests, primaryRequest)
|
|
|
|
requests = append(requests, alternativeRequests...)
|
2016-06-23 11:19:09 +08:00
|
|
|
|
2018-07-10 14:18:20 +08:00
|
|
|
var lastError error
|
2018-11-21 03:35:45 +08:00
|
|
|
ret := &AssignResult{}
|
|
|
|
|
2018-07-10 14:18:20 +08:00
|
|
|
for i, request := range requests {
|
|
|
|
if request == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2019-05-28 13:54:58 +08:00
|
|
|
lastError = WithMasterServerClient(server, grpcDialOption, func(masterClient master_pb.SeaweedClient) error {
|
2019-01-10 16:43:44 +08:00
|
|
|
|
2018-11-21 03:35:45 +08:00
|
|
|
req := &master_pb.AssignRequest{
|
|
|
|
Count: primaryRequest.Count,
|
|
|
|
Replication: primaryRequest.Replication,
|
|
|
|
Collection: primaryRequest.Collection,
|
|
|
|
Ttl: primaryRequest.Ttl,
|
|
|
|
DataCenter: primaryRequest.DataCenter,
|
|
|
|
Rack: primaryRequest.Rack,
|
|
|
|
DataNode: primaryRequest.DataNode,
|
|
|
|
}
|
2019-02-20 17:01:01 +08:00
|
|
|
resp, grpcErr := masterClient.Assign(context.Background(), req)
|
2018-11-21 03:35:45 +08:00
|
|
|
if grpcErr != nil {
|
|
|
|
return grpcErr
|
|
|
|
}
|
|
|
|
|
|
|
|
ret.Count = resp.Count
|
|
|
|
ret.Fid = resp.Fid
|
|
|
|
ret.Url = resp.Url
|
|
|
|
ret.PublicUrl = resp.PublicUrl
|
|
|
|
ret.Error = resp.Error
|
2019-02-15 16:09:19 +08:00
|
|
|
ret.Auth = security.EncodedJwt(resp.Auth)
|
2018-11-21 03:35:45 +08:00
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
if lastError != nil {
|
|
|
|
continue
|
2018-07-10 14:18:20 +08:00
|
|
|
}
|
2018-11-21 03:35:45 +08:00
|
|
|
|
2018-07-10 14:18:20 +08:00
|
|
|
if ret.Count <= 0 {
|
|
|
|
lastError = fmt.Errorf("assign failure %d: %v", i+1, ret.Error)
|
|
|
|
continue
|
|
|
|
}
|
2018-11-21 03:35:45 +08:00
|
|
|
|
2013-08-14 14:26:51 +08:00
|
|
|
}
|
2018-11-21 03:35:45 +08:00
|
|
|
|
|
|
|
return ret, lastError
|
2013-08-14 14:26:51 +08:00
|
|
|
}
|
2019-02-15 16:09:19 +08:00
|
|
|
|
|
|
|
func LookupJwt(master string, fileId string) security.EncodedJwt {
|
|
|
|
|
|
|
|
tokenStr := ""
|
|
|
|
|
|
|
|
if h, e := util.Head(fmt.Sprintf("http://%s/dir/lookup?fileId=%s", master, fileId)); e == nil {
|
|
|
|
bearer := h.Get("Authorization")
|
|
|
|
if len(bearer) > 7 && strings.ToUpper(bearer[0:6]) == "BEARER" {
|
|
|
|
tokenStr = bearer[7:]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return security.EncodedJwt(tokenStr)
|
|
|
|
}
|