github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/gce/instance.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package gce 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/instance" 10 "github.com/juju/juju/network" 11 "github.com/juju/juju/provider/common" 12 "github.com/juju/juju/provider/gce/google" 13 "github.com/juju/juju/status" 14 ) 15 16 type environInstance struct { 17 base *google.Instance 18 env *environ 19 } 20 21 var _ instance.Instance = (*environInstance)(nil) 22 23 func newInstance(base *google.Instance, env *environ) *environInstance { 24 return &environInstance{ 25 base: base, 26 env: env, 27 } 28 } 29 30 // Id implements instance.Instance. 31 func (inst *environInstance) Id() instance.Id { 32 return instance.Id(inst.base.ID) 33 } 34 35 // Status implements instance.Instance. 36 func (inst *environInstance) Status() instance.InstanceStatus { 37 instStatus := inst.base.Status() 38 jujuStatus := status.StatusProvisioning 39 switch instStatus { 40 case "PROVISIONING", "STAGING": 41 jujuStatus = status.StatusProvisioning 42 case "RUNNING": 43 jujuStatus = status.StatusRunning 44 case "STOPPING", "TERMINATED": 45 jujuStatus = status.StatusEmpty 46 default: 47 jujuStatus = status.StatusEmpty 48 } 49 return instance.InstanceStatus{ 50 Status: jujuStatus, 51 Message: instStatus, 52 } 53 } 54 55 // Addresses implements instance.Instance. 56 func (inst *environInstance) Addresses() ([]network.Address, error) { 57 return inst.base.Addresses(), nil 58 } 59 60 func findInst(id instance.Id, instances []instance.Instance) instance.Instance { 61 for _, inst := range instances { 62 if id == inst.Id() { 63 return inst 64 } 65 } 66 return nil 67 } 68 69 // firewall stuff 70 71 // OpenPorts opens the given ports on the instance, which 72 // should have been started with the given machine id. 73 func (inst *environInstance) OpenPorts(machineID string, ports []network.PortRange) error { 74 // TODO(ericsnow) Make sure machineId matches inst.Id()? 75 name := common.MachineFullName(inst.env.Config().UUID(), machineID) 76 err := inst.env.gce.OpenPorts(name, ports...) 77 return errors.Trace(err) 78 } 79 80 // ClosePorts closes the given ports on the instance, which 81 // should have been started with the given machine id. 82 func (inst *environInstance) ClosePorts(machineID string, ports []network.PortRange) error { 83 name := common.MachineFullName(inst.env.Config().UUID(), machineID) 84 err := inst.env.gce.ClosePorts(name, ports...) 85 return errors.Trace(err) 86 } 87 88 // Ports returns the set of ports open on the instance, which 89 // should have been started with the given machine id. 90 // The ports are returned as sorted by SortPorts. 91 func (inst *environInstance) Ports(machineID string) ([]network.PortRange, error) { 92 name := common.MachineFullName(inst.env.Config().UUID(), machineID) 93 ports, err := inst.env.gce.Ports(name) 94 return ports, errors.Trace(err) 95 }