github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/container/lxd/instance.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lxd
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/lxc/lxd/client"
    11  	"github.com/lxc/lxd/shared/api"
    12  
    13  	"github.com/juju/juju/core/instance"
    14  	"github.com/juju/juju/core/status"
    15  	"github.com/juju/juju/environs/context"
    16  	"github.com/juju/juju/environs/instances"
    17  	"github.com/juju/juju/network"
    18  )
    19  
    20  type lxdInstance struct {
    21  	id     string
    22  	server lxd.ContainerServer
    23  }
    24  
    25  var _ instances.Instance = (*lxdInstance)(nil)
    26  
    27  // Id implements instances.instance.Id.
    28  func (lxd *lxdInstance) Id() instance.Id {
    29  	return instance.Id(lxd.id)
    30  }
    31  
    32  func (*lxdInstance) Refresh() error {
    33  	return nil
    34  }
    35  
    36  func (lxd *lxdInstance) Addresses(ctx context.ProviderCallContext) ([]network.Address, error) {
    37  	return nil, errors.NotImplementedf("lxdInstance.Addresses")
    38  }
    39  
    40  // Status implements instances.Instance.Status.
    41  func (lxd *lxdInstance) Status(ctx context.ProviderCallContext) instance.Status {
    42  	jujuStatus := status.Pending
    43  	instStatus, _, err := lxd.server.GetContainerState(lxd.id)
    44  	if err != nil {
    45  		return instance.Status{
    46  			Status:  status.Empty,
    47  			Message: fmt.Sprintf("could not get status: %v", err),
    48  		}
    49  	}
    50  	switch instStatus.StatusCode {
    51  	case api.Starting, api.Started:
    52  		jujuStatus = status.Allocating
    53  	case api.Running:
    54  		jujuStatus = status.Running
    55  	case api.Freezing, api.Frozen, api.Thawed, api.Stopping, api.Stopped:
    56  		jujuStatus = status.Empty
    57  	default:
    58  		jujuStatus = status.Empty
    59  	}
    60  	return instance.Status{
    61  		Status:  jujuStatus,
    62  		Message: instStatus.Status,
    63  	}
    64  }
    65  
    66  // OpenPorts implements instances.Instance.OpenPorts.
    67  func (lxd *lxdInstance) OpenPorts(ctx context.ProviderCallContext, machineId string, rules []network.IngressRule) error {
    68  	return fmt.Errorf("not implemented")
    69  }
    70  
    71  // ClosePorts implements instances.Instance.ClosePorts.
    72  func (lxd *lxdInstance) ClosePorts(ctx context.ProviderCallContext, machineId string, rules []network.IngressRule) error {
    73  	return fmt.Errorf("not implemented")
    74  }
    75  
    76  // IngressRules implements instances.Instance.IngressRules.
    77  func (lxd *lxdInstance) IngressRules(ctx context.ProviderCallContext, machineId string) ([]network.IngressRule, error) {
    78  	return nil, fmt.Errorf("not implemented")
    79  }
    80  
    81  // Add a string representation of the id.
    82  func (lxd *lxdInstance) String() string {
    83  	return fmt.Sprintf("lxd:%s", lxd.id)
    84  }