github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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  
    31  	logger.Debugf("Synchronise images for %s %s %v", params.Series, params.Arch, params.ImageDownloadUrl)
    32  	if err := SyncImages(params.Series, params.Arch, params.ImageDownloadUrl); err != nil {
    33  		return err
    34  	}
    35  	var bridge string
    36  	if params.Network != nil {
    37  		if params.Network.NetworkType == container.BridgeNetwork {
    38  			bridge = params.Network.Device
    39  		} else {
    40  			err := errors.New("Non-bridge network devices not yet supported")
    41  			logger.Infof(err.Error())
    42  			return err
    43  		}
    44  	}
    45  	logger.Debugf("Create the machine %s", c.name)
    46  	if err := CreateMachine(CreateMachineParams{
    47  		Hostname:      c.name,
    48  		Series:        params.Series,
    49  		Arch:          params.Arch,
    50  		UserDataFile:  params.UserDataFile,
    51  		NetworkBridge: bridge,
    52  		Memory:        params.Memory,
    53  		CpuCores:      params.CpuCores,
    54  		RootDisk:      params.RootDisk,
    55  	}); err != nil {
    56  		return err
    57  	}
    58  
    59  	logger.Debugf("Set machine %s to autostart", c.name)
    60  	return AutostartMachine(c.name)
    61  }
    62  
    63  func (c *kvmContainer) Stop() error {
    64  	if !c.IsRunning() {
    65  		logger.Debugf("%s is already stopped", c.name)
    66  		return nil
    67  	}
    68  	// Make started state unknown again.
    69  	c.started = nil
    70  	logger.Debugf("Stop %s", c.name)
    71  	return DestroyMachine(c.name)
    72  }
    73  
    74  func (c *kvmContainer) IsRunning() bool {
    75  	if c.started != nil {
    76  		return *c.started
    77  	}
    78  	machines, err := ListMachines()
    79  	if err != nil {
    80  		return false
    81  	}
    82  	c.started = isRunning(machines[c.name])
    83  	return *c.started
    84  }
    85  
    86  func (c *kvmContainer) String() string {
    87  	return fmt.Sprintf("<KVM container %v>", *c)
    88  }