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