github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/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  	lxd "github.com/canonical/lxd/client"
    10  	"github.com/canonical/lxd/shared/api"
    11  	"github.com/juju/errors"
    12  
    13  	"github.com/juju/juju/core/instance"
    14  	corenetwork "github.com/juju/juju/core/network"
    15  	"github.com/juju/juju/core/network/firewall"
    16  	"github.com/juju/juju/core/status"
    17  	"github.com/juju/juju/environs/context"
    18  	"github.com/juju/juju/environs/instances"
    19  )
    20  
    21  type lxdInstance struct {
    22  	id     string
    23  	server lxd.InstanceServer
    24  }
    25  
    26  var _ instances.Instance = (*lxdInstance)(nil)
    27  
    28  // Id implements instances.instance.Id.
    29  func (lxd *lxdInstance) Id() instance.Id {
    30  	return instance.Id(lxd.id)
    31  }
    32  
    33  func (*lxdInstance) Refresh() error {
    34  	return nil
    35  }
    36  
    37  func (lxd *lxdInstance) Addresses(ctx context.ProviderCallContext) (corenetwork.ProviderAddresses, error) {
    38  	return nil, errors.NotImplementedf("lxdInstance.Addresses")
    39  }
    40  
    41  // Status implements instances.Instance.Status.
    42  func (lxd *lxdInstance) Status(ctx context.ProviderCallContext) instance.Status {
    43  	instStatus, _, err := lxd.server.GetInstanceState(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  	var jujuStatus status.Status
    51  	switch instStatus.StatusCode {
    52  	case api.Starting, api.Started:
    53  		jujuStatus = status.Allocating
    54  	case api.Running:
    55  		jujuStatus = status.Running
    56  	case api.Freezing, api.Frozen, api.Thawed, api.Stopping, api.Stopped:
    57  		jujuStatus = status.Empty
    58  	default:
    59  		jujuStatus = status.Empty
    60  	}
    61  	return instance.Status{
    62  		Status:  jujuStatus,
    63  		Message: instStatus.Status,
    64  	}
    65  }
    66  
    67  // OpenPorts implements instances.Instance.OpenPorts.
    68  func (lxd *lxdInstance) OpenPorts(ctx context.ProviderCallContext, machineId string, rules firewall.IngressRules) error {
    69  	return fmt.Errorf("not implemented")
    70  }
    71  
    72  // ClosePorts implements instances.Instance.ClosePorts.
    73  func (lxd *lxdInstance) ClosePorts(ctx context.ProviderCallContext, machineId string, rules firewall.IngressRules) error {
    74  	return fmt.Errorf("not implemented")
    75  }
    76  
    77  // IngressRules implements instances.Instance.IngressRules.
    78  func (lxd *lxdInstance) IngressRules(ctx context.ProviderCallContext, machineId string) (firewall.IngressRules, error) {
    79  	return nil, fmt.Errorf("not implemented")
    80  }
    81  
    82  // Add a string representation of the id.
    83  func (lxd *lxdInstance) String() string {
    84  	return fmt.Sprintf("lxd:%s", lxd.id)
    85  }