/
environ_network.go
91 lines (75 loc) · 3 KB
/
environ_network.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2015 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
// +build !gccgo
package vsphere
import (
"github.com/juju/errors"
"github.com/juju/juju/instance"
"github.com/juju/juju/network"
)
// AllocateAddress implements environs.Environ.
func (env *environ) AllocateAddress(instID instance.Id, subnetID network.Id, addr *network.Address, _, _ string) error {
return env.changeAddress(instID, subnetID, *addr, true)
}
// ReleaseAddress implements environs.Environ.
func (env *environ) ReleaseAddress(instID instance.Id, netID network.Id, addr network.Address, _, _ string) error {
return env.changeAddress(instID, netID, addr, false)
}
func (env *environ) changeAddress(instID instance.Id, netID network.Id, addr network.Address, add bool) error {
instances, err := env.Instances([]instance.Id{instID})
if err != nil {
return errors.Trace(err)
}
inst := instances[0].(*environInstance)
_, client, err := inst.getInstanceConfigurator()
if err != nil {
return errors.Trace(err)
}
interfaceName := "eth0"
if string(netID) == env.ecfg.externalNetwork() {
interfaceName = "eth1"
}
if add {
err = client.AddIpAddress(interfaceName, addr.Value)
} else {
err = client.ReleaseIpAddress(addr.Value)
}
return errors.Trace(err)
}
// SupportsSpaces is specified on environs.Networking.
func (env *environ) SupportsSpaces() (bool, error) {
return false, errors.NotSupportedf("spaces")
}
// SupportsAddressAllocation is specified on environs.Networking.
func (env *environ) SupportsAddressAllocation(_ network.Id) (bool, error) {
return false, errors.NotSupportedf("address allocation")
}
// Subnets implements environs.Environ.
func (env *environ) Subnets(inst instance.Id, ids []network.Id) ([]network.SubnetInfo, error) {
return env.client.Subnets(inst, ids)
}
// NetworkInterfaces implements environs.Environ.
func (env *environ) NetworkInterfaces(inst instance.Id) ([]network.InterfaceInfo, error) {
return env.client.GetNetworkInterfaces(inst, env.ecfg)
}
// OpenPorts opens the given port ranges for the whole environment.
// Must only be used if the environment was setup with the
// FwGlobal firewall mode.
func (env *environ) OpenPorts(ports []network.PortRange) error {
return errors.Trace(errors.NotSupportedf("ClosePorts"))
}
// ClosePorts closes the given port ranges for the whole environment.
// Must only be used if the environment was setup with the
// FwGlobal firewall mode.
func (env *environ) ClosePorts(ports []network.PortRange) error {
return errors.Trace(errors.NotSupportedf("ClosePorts"))
}
// Ports returns the port ranges opened for the whole environment.
// Must only be used if the environment was setup with the
// FwGlobal firewall mode.
func (env *environ) Ports() ([]network.PortRange, error) {
return nil, errors.Trace(errors.NotSupportedf("Ports"))
}
func (e *environ) AllocateContainerAddresses(hostInstanceID instance.Id, preparedInfo []network.InterfaceInfo) ([]network.InterfaceInfo, error) {
return nil, errors.NotSupportedf("container address allocation")
}