github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/container/kvm/container.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package kvm
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  
    11  	"github.com/juju/juju/container"
    12  )
    13  
    14  type kvmContainer struct {
    15  	factory *containerFactory
    16  	name    string
    17  	// started is a three state boolean, true, false, or unknown
    18  	// this allows for checking when we don't know, but using a
    19  	// value if we already know it (like in the list situation).
    20  	started *bool
    21  }
    22  
    23  var _ Container = (*kvmContainer)(nil)
    24  
    25  func (c *kvmContainer) Name() string {
    26  	return c.name
    27  }
    28  
    29  func (c *kvmContainer) Start(params StartParams) error {
    30  	logger.Debugf("Synchronise images for %s %s", params.Series, params.Arch)
    31  	if err := SyncImages(params.Series, params.Arch); err != nil {
    32  		return err
    33  	}
    34  	var bridge string
    35  	if params.Network != nil {
    36  		if params.Network.NetworkType == container.BridgeNetwork {
    37  			bridge = params.Network.Device
    38  		} else {
    39  			return errors.LoggedErrorf(logger, "Non-bridge network devices not yet supported")
    40  		}
    41  	}
    42  	logger.Debugf("Create the machine %s", c.name)
    43  	if err := CreateMachine(CreateMachineParams{
    44  		Hostname:      c.name,
    45  		Series:        params.Series,
    46  		Arch:          params.Arch,
    47  		UserDataFile:  params.UserDataFile,
    48  		NetworkBridge: bridge,
    49  		Memory:        params.Memory,
    50  		CpuCores:      params.CpuCores,
    51  		RootDisk:      params.RootDisk,
    52  	}); err != nil {
    53  		return err
    54  	}
    55  
    56  	logger.Debugf("Set machine %s to autostart", c.name)
    57  	return AutostartMachine(c.name)
    58  }
    59  
    60  func (c *kvmContainer) Stop() error {
    61  	if !c.IsRunning() {
    62  		logger.Debugf("%s is already stopped", c.name)
    63  		return nil
    64  	}
    65  	// Make started state unknown again.
    66  	c.started = nil
    67  	logger.Debugf("Stop %s", c.name)
    68  	return DestroyMachine(c.name)
    69  }
    70  
    71  func (c *kvmContainer) IsRunning() bool {
    72  	if c.started != nil {
    73  		return *c.started
    74  	}
    75  	machines, err := ListMachines()
    76  	if err != nil {
    77  		return false
    78  	}
    79  	c.started = isRunning(machines[c.name])
    80  	return *c.started
    81  }
    82  
    83  func (c *kvmContainer) String() string {
    84  	return fmt.Sprintf("<KVM container %v>", *c)
    85  }