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 }