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 }