Skip to content

Commit 77894f9

Browse files
author
Joshua Reed
committed
Add integ test for network creation.
1 parent 5630c69 commit 77894f9

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

pkg/cloud/network.go

+27-20
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type NetworkIface interface {
3636
GetOrCreateLoadBalancerRule(*capcv1.CloudStackCluster) error
3737
GetOrCreateIsolatedNetwork(*capcv1.CloudStackCluster) error
3838
AssociatePublicIPAddress(*capcv1.CloudStackCluster) error
39+
DeleteNetwork(capcv1.Network) error
3940
}
4041

4142
const (
@@ -132,14 +133,14 @@ func (c *client) CreateIsolatedNetwork(csCluster *capcv1.CloudStackCluster) (ret
132133
setIfNotEmpty(csCluster.Status.DomainID, p.SetDomainid)
133134
resp, err := c.cs.Network.CreateNetwork(p)
134135
if err != nil {
135-
return err
136+
return errors.Wrapf(err, "error encountered when creating network with name: %s", netStatus.Name)
136137
}
137138

138139
// Update Zone/Network status accordingly.
139140
netStatus.ID = resp.Id
140141
netStatus.Type = resp.Type
141142
zoneStatus.Network = netStatus
142-
csCluster.Status.Zones[zoneStatus.Name] = zoneStatus
143+
csCluster.Status.Zones[zoneStatus.ID] = zoneStatus
143144

144145
if err := c.AddCreatedByCAPCTag(ResourceTypeNetwork, zoneStatus.Network.ID); err != nil {
145146
return err
@@ -193,7 +194,7 @@ func (c *client) DeleteNetworkIfNotInUse(csCluster *capcv1.CloudStackCluster, ne
193194
}
194195

195196
if clusterTagCount == 0 && tags[CreatedByCAPCTagName] != "" {
196-
return c.DestroyNetwork(net)
197+
return c.DeleteNetwork(net)
197198
}
198199

199200
return nil
@@ -209,9 +210,7 @@ func (c *client) FetchPublicIP(csCluster *capcv1.CloudStackCluster) (*cloudstack
209210
p.SetZoneid(zoneStatus.ID)
210211
setIfNotEmpty(csCluster.Spec.Account, p.SetAccount)
211212
setIfNotEmpty(csCluster.Status.DomainID, p.SetDomainid)
212-
if ip != "" {
213-
p.SetIpaddress(ip)
214-
}
213+
setIfNotEmpty(ip, p.SetIpaddress)
215214
publicAddresses, err := c.cs.Address.ListPublicIpAddresses(p)
216215

217216
if err != nil {
@@ -234,25 +233,37 @@ func (c *client) FetchPublicIP(csCluster *capcv1.CloudStackCluster) (*cloudstack
234233
func (c *client) AssociatePublicIPAddress(csCluster *capcv1.CloudStackCluster) (retErr error) {
235234
publicAddress, err := c.FetchPublicIP(csCluster)
236235
if err != nil {
237-
return err
236+
return errors.Wrapf(err, "error encountered while fetching a public IP address")
238237
}
239238

240239
csCluster.Spec.ControlPlaneEndpoint.Host = publicAddress.Ipaddress
241240
csCluster.Status.PublicIPID = publicAddress.Id
242241

242+
// Check if the address is already associated with the network.
243243
zoneStatus := csCluster.Status.Zones.GetOne()
244+
if publicAddress.Associatednetworkid == zoneStatus.Network.ID {
245+
return nil
246+
}
244247

245-
// Public IP found, but not yet allocated to network.
248+
// Public IP found, but not yet associated with network -- associate it.
246249
p := c.cs.Address.NewAssociateIpAddressParams()
247250
p.SetIpaddress(csCluster.Spec.ControlPlaneEndpoint.Host)
248251
p.SetNetworkid(zoneStatus.Network.ID)
249252
setIfNotEmpty(csCluster.Spec.Account, p.SetAccount)
250253
setIfNotEmpty(csCluster.Status.DomainID, p.SetDomainid)
251254
if _, err := c.cs.Address.AssociateIpAddress(p); err != nil {
252-
return err
255+
return errors.Wrapf(err,
256+
"error encountered while associating public IP address with ID: %s to netowrk with ID: %s",
257+
publicAddress.Id, zoneStatus.Network.ID)
253258
}
254259
if err := c.AddClusterTag(ResourceTypeIPAddress, publicAddress.Id, csCluster); err != nil {
255-
return err
260+
return errors.Wrapf(err,
261+
"error encountered while adding tag to public IP address with ID: %s", publicAddress.Id)
262+
}
263+
// Add created by CAPC tag to public IP.
264+
if err := c.AddCreatedByCAPCTag(ResourceTypeIPAddress, csCluster.Status.PublicIPID); err != nil {
265+
return errors.Wrapf(err,
266+
"error encountered while adding tag to public IP address with ID: %s", publicAddress.Id)
256267
}
257268
return nil
258269
}
@@ -343,9 +354,9 @@ func (c *client) GetOrCreateLoadBalancerRule(csCluster *capcv1.CloudStackCluster
343354
return nil
344355
}
345356

346-
func (c *client) DestroyNetwork(net capcv1.Network) (retErr error) {
347-
_, retErr = c.cs.Network.DeleteNetwork(c.cs.Network.NewDeleteNetworkParams(net.ID))
348-
return retErr
357+
func (c *client) DeleteNetwork(net capcv1.Network) error {
358+
_, err := c.cs.Network.DeleteNetwork(c.cs.Network.NewDeleteNetworkParams(net.ID))
359+
return errors.Wrapf(err, "error encountered while deleting network with id: %s", net.ID)
349360
}
350361

351362
func (c *client) AssignVMToLoadBalancerRule(csCluster *capcv1.CloudStackCluster, instanceID string) (retErr error) {
@@ -374,21 +385,17 @@ func (c *client) GetOrCreateIsolatedNetwork(csCluster *capcv1.CloudStackCluster)
374385
onlyNetStatus := csCluster.Status.Zones.GetOne().Network
375386
if !NetworkExists(onlyNetStatus) { // create isolated network.
376387
if err := c.CreateIsolatedNetwork(csCluster); err != nil {
377-
return err
388+
return errors.Wrap(err, "error encountered while creating a new isolated network.")
378389
}
379390
}
380391
networkID := csCluster.Status.Zones.GetOne().Network.ID
381392
if err := c.AddClusterTag(ResourceTypeNetwork, networkID, csCluster); err != nil {
382-
return err
393+
return errors.Wrapf(err, "error encountered while tagging network with id: %s", networkID)
383394
}
384395

385396
if csCluster.Status.PublicIPID == "" { // Don't try to get public IP again it's already been fetched.
386397
if err := c.AssociatePublicIPAddress(csCluster); err != nil {
387-
return err
388-
}
389-
// Add created by CAPC tag to public IP.
390-
if err := c.AddCreatedByCAPCTag(ResourceTypeIPAddress, csCluster.Status.PublicIPID); err != nil {
391-
return err
398+
return errors.Wrapf(err, "error encountered when associating public IP address to csCluster")
392399
}
393400
}
394401
if err := c.GetOrCreateLoadBalancerRule(csCluster); err != nil {

pkg/cloud/network_test.go

+37
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,41 @@ var _ = Describe("Network", func() {
276276
Ω(client.ResolveNetwork(dummies.CSCluster, &dummies.ISONet1)).Should(Succeed())
277277
})
278278
})
279+
280+
Context("Network Semi-Integ Tests", func() {
281+
client, connectionErr := cloud.NewClient("../../cloud-config")
282+
283+
BeforeEach(func() {
284+
if connectionErr != nil { // Only do these tests if an actual ACS instance is available via cloud-config.
285+
Skip("Could not connect to ACS instance.")
286+
}
287+
288+
// Setup Isolated Network Dummy Vars.
289+
dummies.ISONet1.ID = "" // Make CAPC methods resolve this.
290+
dummies.CSCluster.Spec.ControlPlaneEndpoint.Host = "" // Make CAPC methods resolve this.
291+
dummies.CSCluster.Spec.Zones = []capcv1.Zone{{Name: "zone1", Network: dummies.ISONet1}}
292+
dummies.CSCluster.Status.Zones = capcv1.ZoneStatusMap{}
293+
294+
Ω(client.ResolveZones(dummies.CSCluster)).Should(Succeed())
295+
Ω(client.ResolveNetworkStatuses(dummies.CSCluster)).Should(Succeed())
296+
if dummies.CSCluster.Status.Zones.GetOne().Network.ID != "" { // Delete current test network.
297+
Ω(client.DeleteNetwork(dummies.CSCluster.Status.Zones.GetOne().Network)).Should(Succeed())
298+
}
299+
// Reset status.
300+
dummies.CSCluster.Spec.Zones = []capcv1.Zone{{Name: "zone1", Network: dummies.ISONet1}}
301+
Ω(client.ResolveZones(dummies.CSCluster)).Should(Succeed())
302+
Ω(client.ResolveNetworkStatuses(dummies.CSCluster)).Should(Succeed())
303+
})
304+
305+
It("adds an isolated network and doesn't fail when asked to GetOrCreateIsolatedNetwork multiple times", func() {
306+
Ω(client.GetOrCreateIsolatedNetwork(dummies.CSCluster)).Should(Succeed())
307+
Ω(client.GetOrCreateIsolatedNetwork(dummies.CSCluster)).Should(Succeed())
308+
// Reset status.
309+
dummies.CSCluster.Spec.Zones = []capcv1.Zone{{Name: "zone1", Network: dummies.ISONet1}}
310+
Ω(client.ResolveZones(dummies.CSCluster)).Should(Succeed())
311+
Ω(client.ResolveNetworkStatuses(dummies.CSCluster)).Should(Succeed())
312+
// Do once more.
313+
Ω(client.GetOrCreateIsolatedNetwork(dummies.CSCluster)).Should(Succeed())
314+
})
315+
})
279316
})

test/dummies/vars.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func SetDummyCAPCClusterVars() {
171171
CSClusterKind = "CloudStackCluster"
172172
CSClusterName = "test-cluster"
173173
EndPointHost = "EndpointHost"
174-
EndPointPort = int32(8675309)
174+
EndPointPort = int32(5309)
175175
PublicIPID = "FakePublicIPID"
176176

177177
CSlusterNamespace = "default"

0 commit comments

Comments
 (0)