netns

package
v0.0.0-...-a37c8fb Latest Latest
Warning

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

Go to latest
Published: Jan 6, 2017 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Overview

Package netns provides a utility function that allows a user to perform actions in a different network namespace

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Do

func Do(nsName string, cb Callback) error

Do takes a function which it will call in the network namespace specified by nsName. The goroutine that calls this will lock itself to its current OS thread, hop namespaces, call the given function, hop back to its original namespace, and then unlock itself from its current OS thread. Do returns an error if an error occurs at any point besides in the invocation of the given function. The caller should check both the error of Do and any errors from the given function call.

The callback function is expected to do something simple such as just creating a socket / opening a connection, as it's not desirable to start complex logic in a goroutine that is pinned to the current OS thread. Also any goroutine started from the callback function may or may not execute in the desired namespace.

Example (HttpClient)
package main

import (
	"net"
	"net/http"
	"time"

	"github.com/aristanetworks/goarista/netns"
)

func main() {
	vrf := "management"
	vrf = netns.VRFToNetNS(vrf) // vrf is now "ns-management"

	dial := func(network, address string) (conn net.Conn, err error) {
		nserr := netns.Do(vrf, func() {
			conn, err = (&net.Dialer{
				Timeout:   30 * time.Second, // This is the connection timeout
				KeepAlive: 30 * time.Second,
			}).Dial(network, address)
		})
		if nserr != nil {
			return nil, nserr
		}
		return
	}

	client := &http.Client{
		Transport: &http.Transport{
			//TLSClientConfig: ..., <- if you need SSL/TLS.
			Dial: dial,
		},
		Timeout: 30 * time.Second, // This is the request timeout
	}

	resp, err := client.Get("http://example.com")
	_ = resp
	_ = err
}
Output:

func ParseAddress

func ParseAddress(address string) (nsName string, addr string, err error)

ParseAddress takes in an address string, parsing out the address and an optional VRF name. It returns the namespace corresponding to the VRF. The expected form is [<vrf-name>/]address:port. However, ParseAddress will not actually check to see if the VRF name or address are valid. Presumably, when those values are used later, they will fail if they are malformed

func VRFToNetNS

func VRFToNetNS(vrf string) string

VRFToNetNS converts a VRF name to network namespace's name corresponding to that VRF.

Types

type Callback

type Callback func()

Callback is a function that gets called in a given network namespace. The user needs to check any errors from any calls inside this function.

Jump to

Keyboard shortcuts

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