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