github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/apiserver/sshclient/shim.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the LGPLv3, see LICENCE file for details.
     3  
     4  package sshclient
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  
    10  	"github.com/juju/juju/apiserver/common"
    11  	"github.com/juju/juju/environs/config"
    12  	"github.com/juju/juju/network"
    13  	"github.com/juju/juju/state"
    14  )
    15  
    16  // Backend defines the State API used by the sshclient facade.
    17  type Backend interface {
    18  	ModelConfig() (*config.Config, error)
    19  	GetMachineForEntity(tag string) (SSHMachine, error)
    20  	GetSSHHostKeys(names.MachineTag) (state.SSHHostKeys, error)
    21  }
    22  
    23  // SSHMachine specifies the methods on State.Machine of interest to
    24  // the SSHClient facade.
    25  type SSHMachine interface {
    26  	MachineTag() names.MachineTag
    27  	PublicAddress() (network.Address, error)
    28  	PrivateAddress() (network.Address, error)
    29  }
    30  
    31  // newFacade wraps New to express the supplied *state.State as a Backend.
    32  func newFacade(st *state.State, res *common.Resources, auth common.Authorizer) (*Facade, error) {
    33  	return New(&backend{st}, res, auth)
    34  }
    35  
    36  type backend struct {
    37  	*state.State
    38  }
    39  
    40  // GetMachineForEntity takes a machine or unit tag (as a string) and
    41  // returns the associated SSHMachine.
    42  func (b *backend) GetMachineForEntity(tagString string) (SSHMachine, error) {
    43  	tag, err := names.ParseTag(tagString)
    44  	if err != nil {
    45  		return nil, errors.Trace(err)
    46  	}
    47  
    48  	switch tag := tag.(type) {
    49  	case names.MachineTag:
    50  		machine, err := b.State.Machine(tag.Id())
    51  		if err != nil {
    52  			return nil, errors.Trace(err)
    53  		}
    54  		return machine, nil
    55  	case names.UnitTag:
    56  		unit, err := b.State.Unit(tag.Id())
    57  		if err != nil {
    58  			return nil, errors.Trace(err)
    59  		}
    60  		machineId, err := unit.AssignedMachineId()
    61  		if err != nil {
    62  			return nil, errors.Trace(err)
    63  		}
    64  		machine, err := b.State.Machine(machineId)
    65  		if err != nil {
    66  			return nil, errors.Trace(err)
    67  		}
    68  		return machine, nil
    69  	default:
    70  		return nil, errors.Errorf("unsupported entity: %q", tagString)
    71  	}
    72  }