Documentation ¶
Index ¶
- Constants
- Variables
- func AddStateInstance(stor storage.Storage, id instance.Id) error
- func Bootstrap(ctx environs.BootstrapContext, env environs.Environ, ...) (*environs.BootstrapResult, error)
- func BootstrapInstance(ctx environs.BootstrapContext, env environs.Environ, ...) (_ *environs.StartInstanceResult, selectedSeries string, ...)
- func ConfigureMachine(ctx environs.BootstrapContext, client ssh.Client, host string, ...) error
- func CreateStateFile(stor storage.Storage) (string, error)
- func DeleteStateFile(stor storage.Storage) error
- func Destroy(env environs.Environ) error
- func DistributeInstances(env ZonedEnviron, candidates, group []instance.Id) ([]instance.Id, error)
- func EnvFullName(modelUUID string) string
- func GetCheckNonceCommand(instanceConfig *instancecfg.InstanceConfig) string
- func MiBToGiB(m uint64) uint64
- func MinRootDiskSizeGiB(ser string) uint64
- func ProviderStateInstances(stor storage.StorageReader) ([]instance.Id, error)
- func RemoveStateInstances(stor storage.Storage, ids ...instance.Id) error
- func SaveState(storage storage.StorageWriter, state *BootstrapState) error
- func WaitSSH(stdErr io.Writer, interrupted <-chan os.Signal, client ssh.Client, ...) (addr string, err error)
- type AvailabilityZone
- type AvailabilityZoneInstances
- type BootstrapState
- type DefaultProvider
- type Firewaller
- type InstanceConfigurator
- type InstanceRefresher
- type RefreshableInstance
- type ZonedEnviron
Constants ¶
const StateFile = "provider-state"
StateFile is the name of the file where the provider's state is stored.
Variables ¶
var FinishBootstrap = func( ctx environs.BootstrapContext, client ssh.Client, env environs.Environ, inst instance.Instance, instanceConfig *instancecfg.InstanceConfig, opts environs.BootstrapDialOpts, ) error { interrupted := make(chan os.Signal, 1) ctx.InterruptNotify(interrupted) defer ctx.StopInterruptNotify(interrupted) addr, err := WaitSSH( ctx.GetStderr(), interrupted, client, GetCheckNonceCommand(instanceConfig), &RefreshableInstance{inst, env}, opts, ) if err != nil { return err } return ConfigureMachine(ctx, client, addr, instanceConfig) }
FinishBootstrap completes the bootstrap process by connecting to the instance via SSH and carrying out the cloud-config.
Note: FinishBootstrap is exposed so it can be replaced for testing.
var LongAttempt = utils.AttemptStrategy{ Total: 3 * time.Minute, Delay: 1 * time.Second, }
A request may fail to due "eventual consistency" semantics, which should resolve fairly quickly. These delays are specific to the provider and best tuned there. Other requests fail due to a slow state transition (e.g. an instance taking a while to release a security group after termination). If you need to poll for the latter kind, use LongAttempt.
TODO(katco): 2016-08-09: lp:1611427
var ShortAttempt = utils.AttemptStrategy{ Total: 5 * time.Second, Delay: 200 * time.Millisecond, }
Use ShortAttempt to poll for short-term events. TODO: This may need tuning for different providers (or even environments).
TODO(katco): 2016-08-09: lp:1611427
Functions ¶
func AddStateInstance ¶
AddStateInstance adds a controller instance ID to the provider-state file in storage.
func Bootstrap ¶
func Bootstrap(ctx environs.BootstrapContext, env environs.Environ, args environs.BootstrapParams, ) (*environs.BootstrapResult, error)
Bootstrap is a common implementation of the Bootstrap method defined on environs.Environ; we strongly recommend that this implementation be used when writing a new provider.
func BootstrapInstance ¶
func BootstrapInstance(ctx environs.BootstrapContext, env environs.Environ, args environs.BootstrapParams, ) (_ *environs.StartInstanceResult, selectedSeries string, _ environs.BootstrapFinalizer, err error)
BootstrapInstance creates a new instance with the series of its choice, constrained to those of the available tools, and returns the instance result, series, and a function that must be called to finalize the bootstrap process by transferring the tools and installing the initial Juju controller. This method is called by Bootstrap above, which implements environs.Bootstrap, but is also exported so that providers can manipulate the started instance.
func ConfigureMachine ¶
func ConfigureMachine(ctx environs.BootstrapContext, client ssh.Client, host string, instanceConfig *instancecfg.InstanceConfig) error
func CreateStateFile ¶
CreateStateFile creates an empty state file on the given storage, and returns its URL.
func DeleteStateFile ¶
DeleteStateFile deletes the state file on the given storage.
func Destroy ¶
Destroy is a common implementation of the Destroy method defined on environs.Environ; we strongly recommend that this implementation be used when writing a new provider.
func DistributeInstances ¶
DistributeInstances is a common function for implement the state.InstanceDistributor policy based on availability zone spread.
func EnvFullName ¶
EnvFullName returns a string based on the provided model UUID that is suitable for identifying the env on a provider.
The resulting string clearly associates the value with juju, whereas the model's UUID alone isn't very distinctive for humans. This benefits users by helping them quickly identify in their hosting management tools which instances are juju related.
func GetCheckNonceCommand ¶
func GetCheckNonceCommand(instanceConfig *instancecfg.InstanceConfig) string
func MiBToGiB ¶
MiBToGiB converts the provided megabytes (base-2) into the nearest gigabytes (base-2), rounding up. This is useful for providers that deal in gigabytes (while juju deals in megabytes).
func MinRootDiskSizeGiB ¶
MinRootDiskSizeGiB is the minimum size for the root disk of an instance, in Gigabytes. This value accommodates the anticipated size of the initial image, any updates, and future application data.
func ProviderStateInstances ¶
func ProviderStateInstances(stor storage.StorageReader) ([]instance.Id, error)
ProviderStateInstances extracts the instance IDs from provider-state.
func RemoveStateInstances ¶
RemoveStateInstances removes controller instance IDs from the provider-state file in storage. Instance IDs that are not found in the file are ignored.
func SaveState ¶
func SaveState(storage storage.StorageWriter, state *BootstrapState) error
SaveState writes the given state to the given storage.
func WaitSSH ¶
func WaitSSH( stdErr io.Writer, interrupted <-chan os.Signal, client ssh.Client, checkHostScript string, inst InstanceRefresher, opts environs.BootstrapDialOpts, ) (addr string, err error)
WaitSSH waits for the instance to be assigned a routable address, then waits until we can connect to it via SSH.
waitSSH attempts on all addresses returned by the instance in parallel; the first succeeding one wins. We ensure that private addresses are for the correct machine by checking the presence of a file on the machine that contains the machine's nonce. The "checkHostScript" is a bash script that performs this file check.
Types ¶
type AvailabilityZone ¶
type AvailabilityZone interface { // Name returns the name of the availability zone. Name() string // Available reports whether the availability zone is currently available. Available() bool }
AvailabilityZone describes a provider availability zone.
type AvailabilityZoneInstances ¶
type AvailabilityZoneInstances struct { // ZoneName is the name of the availability zone. ZoneName string // Instances is a set of instances within the availability zone. Instances []instance.Id }
AvailabilityZoneInstances describes an availability zone and a set of instances in that zone.
func AvailabilityZoneAllocations ¶
func AvailabilityZoneAllocations(env ZonedEnviron, group []instance.Id) ([]AvailabilityZoneInstances, error)
AvailabilityZoneAllocations returns the availability zones and their instance allocations from the specified group, in ascending order of population. Availability zones with the same population size are ordered by name.
If the specified group is empty, then it will behave as if the result of AllInstances were provided.
type BootstrapState ¶
type BootstrapState struct { // StateInstances are the controllers. StateInstances []instance.Id `yaml:"state-instances"` }
BootstrapState is the state information that is stored in StateFile.
Individual providers may define their own state structures instead of this one, and use their own code for loading and saving those, but this is the definition that most practically useful providers share unchanged.
func LoadState ¶
func LoadState(stor storage.StorageReader) (*BootstrapState, error)
LoadState reads state from the given storage.
type DefaultProvider ¶
type DefaultProvider struct { // Env is the Juju environment that methods target. Env environs.Environ }
DefaultProvider exposes the various common implementations found in this package as methods of a single type. This facilitates treating the implementations as a bundle, e.g. satisfying interfaces.
func (DefaultProvider) BootstrapEnv ¶
func (dp DefaultProvider) BootstrapEnv(ctx environs.BootstrapContext, args environs.BootstrapParams) (*environs.BootstrapResult, error)
BootstrapEnv bootstraps the Juju environment.
func (DefaultProvider) DestroyEnv ¶
func (dp DefaultProvider) DestroyEnv() error
DestroyEnv destroys the Juju environment.
type Firewaller ¶
type Firewaller interface { // Ports returns the list of open ports on the named firewall. Ports(fwname string) ([]network.PortRange, error) // OpenPorts opens the specified ports on the named firewall. OpenPorts(fwname string, ports ...network.PortRange) error // ClosePorts closes the specified ports on the named firewall. ClosePorts(fwname string, ports ...network.PortRange) error }
Firewaller provides the functionality to firewalls in a cloud.
func NewFirewaller ¶
func NewFirewaller() Firewaller
NewFirewaller returns a basic default implementation of Firewaller.
type InstanceConfigurator ¶
type InstanceConfigurator interface { // Close all ports. DropAllPorts(exceptPorts []int, addr string) error // Add network interface and allocate external IP address. // Implementations should also configure this interface and initialise ports state. ConfigureExternalIpAddress(apiPort int) error // Open or close ports. ChangePorts(ipAddress string, insert bool, ports []network.PortRange) error // List all opened ports. FindOpenPorts() ([]network.PortRange, error) // Add Ip address. AddIpAddress(nic string, addr string) error // Release Ip address. ReleaseIpAddress(addr string) error }
Implementations of this interface should provide a way to configure external IP allocation and add firewall functionality.
func NewSshInstanceConfigurator ¶
func NewSshInstanceConfigurator(host string) InstanceConfigurator
NewSshInstanceConfigurator creates new sshInstanceConfigurator.
type InstanceRefresher ¶
type InstanceRefresher interface { // Refresh refreshes the addresses for the instance. Refresh() error // Addresses returns the addresses for the instance. // To ensure that the results are up to date, call // Refresh first. Addresses() ([]network.Address, error) // Status returns the provider-specific status for the // instance. Status() instance.InstanceStatus }
InstanceRefresher is the subet of the Instance interface required for waiting for SSH access to become availble.
type RefreshableInstance ¶
func (*RefreshableInstance) Refresh ¶
func (i *RefreshableInstance) Refresh() error
Refresh refreshes the addresses for the instance.
type ZonedEnviron ¶
type ZonedEnviron interface { environs.Environ // AvailabilityZones returns all availability zones in the environment. AvailabilityZones() ([]AvailabilityZone, error) // InstanceAvailabilityZoneNames returns the names of the availability // zones for the specified instances. The error returned follows the same // rules as Environ.Instances. InstanceAvailabilityZoneNames(ids []instance.Id) ([]string, error) }
ZonedEnviron is an environs.Environ that has support for availability zones.