client

package
v0.16.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 22, 2018 License: BSD-3-Clause Imports: 39 Imported by: 0

Documentation

Overview

Package client implements the XRootD client following protocol from http://xrootd.org.

The NewClient function connects to a server:

ctx := context.Background()

client, err := NewClient(ctx, addr, username)
if err != nil {
	// handle error
}

// ...

if err := client.Close(); err != nil {
	// handle error
}

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

A Client to xrootd server which allows to send requests and receive responses. Concurrent requests are supported. Zero value is invalid, Client should be instantiated using NewClient.

Example (Chmod)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().Chmod(ctx, "/tmp/test.txt", xrdfs.OpenModeOwnerRead|xrdfs.OpenModeOwnerWrite); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Dirlist)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

entries, err := client.FS().Dirlist(ctx, "/tmp/dir1")
if err != nil {
	log.Fatal(err)
}
for _, entry := range entries {
	fmt.Printf("Name: %s, size: %d\n", entry.Name(), entry.Size())
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Name: file1.txt, size: 0
Example (Mkdir)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().Mkdir(ctx, "/tmp/testdir", xrdfs.OpenModeOwnerRead|xrdfs.OpenModeOwnerWrite); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (MkdirAll)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().MkdirAll(ctx, "/tmp/testdir/subdir", xrdfs.OpenModeOwnerRead|xrdfs.OpenModeOwnerWrite); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Open)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

file, err := client.FS().Open(ctx, "/tmp/test.txt", xrdfs.OpenModeOwnerRead, xrdfs.OpenOptionsOpenRead)
if err != nil {
	log.Fatal(err)
}

if err := file.Close(ctx); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Read)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

file, err := client.FS().Open(ctx, "/tmp/test.txt", xrdfs.OpenModeOwnerRead, xrdfs.OpenOptionsOpenRead)
if err != nil {
	log.Fatal(err)
}
defer file.Close(ctx)

data := make([]byte, 10)
n, err := file.ReadAt(data, 0)
if err != nil {
	log.Fatal(err)
}

data = data[:n]
fmt.Printf("%s\n", data)

if err := file.Close(ctx); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

test
Example (RemoveAll)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().RemoveAll(ctx, "/tmp/testdir"); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (RemoveDir)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().RemoveDir(ctx, "/tmp/testdir"); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (RemoveFile)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().RemoveFile(ctx, "/tmp/test.txt"); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Rename)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().Rename(ctx, "/tmp/old.txt", "/tmp/new.txt"); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Stat)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

info, err := client.FS().Stat(ctx, "/tmp/test.txt")
if err != nil {
	log.Fatal(err)
}

log.Printf("Name: %s, size: %d", info.Name(), info.Size())

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Truncate)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

if err := client.FS().Truncate(ctx, "/tmp/test.txt", 10); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (VirtualStat)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

info, err := client.FS().VirtualStat(ctx, "/tmp/")
if err != nil {
	log.Fatal(err)
}

log.Printf("RW: %d%% is free", info.FreeRW)

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

Example (Write)
ctx := context.Background()
const username = "gopher"
client, err := NewClient(ctx, "ccxrootdgotest.in2p3.fr:9001", username)
if err != nil {
	log.Fatal(err)
}
defer client.Close()

file, err := client.FS().Open(ctx, "/tmp/test.txt", xrdfs.OpenModeOwnerRead|xrdfs.OpenModeOwnerWrite, xrdfs.OpenOptionsOpenUpdate|xrdfs.OpenOptionsNew)
if err != nil {
	log.Fatal(err)
}
defer file.Close(ctx)

if _, err := file.WriteAt([]byte("test"), 0); err != nil {
	log.Fatal(err)
}

if err := file.Sync(ctx); err != nil {
	log.Fatal(err)
}

if err := file.Close(ctx); err != nil {
	log.Fatal(err)
}

if err := client.Close(); err != nil {
	log.Fatal(err)
}
Output:

func NewClient

func NewClient(ctx context.Context, address string, username string, opts ...Option) (*Client, error)

NewClient creates a new xrootd client that connects to the given address using username. Options opts configure the client and are applied in the order they were specified. When the context expires, a response handling is stopped, however, it is necessary to call Cancel to correctly free resources.

func (*Client) Close

func (client *Client) Close() error

Close closes the connection. Any blocked operation will be unblocked and return error.

func (*Client) FS

func (cli *Client) FS() xrdfs.FileSystem

FS returns a xrdfs.FileSystem which uses this client to make requests.

func (*Client) Send

func (client *Client) Send(ctx context.Context, resp xrdproto.Response, req xrdproto.Request) (string, error)

Send sends the request to the server and stores the response inside the resp. If the resp is nil, then no response is stored. Send returns a session id which identifies the server that provided response.

type Option

type Option func(*Client) error

Option configures an XRootD client.

func WithAuth

func WithAuth(a auth.Auther) Option

WithAuth adds an authentication mechanism to the XRootD client. If an authentication mechanism was already registered for that provider, it will be silently replaced.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL