Skip to content

Commit a0f04a8

Browse files
committed
Added code to create, query, and delete network tags
1 parent ed119d7 commit a0f04a8

File tree

2 files changed

+58
-64
lines changed

2 files changed

+58
-64
lines changed

pkg/cloud/tags.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,42 @@ package cloud
1818

1919
type TagIFace interface {
2020
TagNetwork(string, map[string]string) error
21+
GetNetworkTags(string) (map[string]string, error)
22+
DeleteNetworkTags(string, map[string]string) error
2123
}
2224

25+
const resourceTypeNetwork = "network"
26+
2327
// TagNetwork adds tags to a network by network id.
24-
func (c *client) TagNetwork(networkId string, tag map[string]string) error {
25-
p := c.cs.Resourcetags.NewCreateTagsParams([]string{"someid"}, "network", map[string]string{"some": "tag"})
28+
func (c *client) TagNetwork(networkId string, tags map[string]string) error {
29+
// https://cloudstack.apache.org/api/apidocs-4.16/apis/createTags.html
30+
p := c.cs.Resourcetags.NewCreateTagsParams([]string{networkId}, resourceTypeNetwork, tags)
2631
_, err := c.cs.Resourcetags.CreateTags(p)
2732
return err
2833
}
34+
35+
// GetNetworkTags gets tags by network id.
36+
func (c *client) GetNetworkTags(networkId string) (map[string]string, error) {
37+
// https://cloudstack.apache.org/api/apidocs-4.16/apis/listTags.html
38+
p := c.cs.Resourcetags.NewListTagsParams()
39+
p.SetResourceid(networkId)
40+
p.SetResourcetype(resourceTypeNetwork)
41+
if listTagResponse, err := c.cs.Resourcetags.ListTags(p); err != nil {
42+
return nil, err
43+
} else {
44+
tags := make(map[string]string, listTagResponse.Count)
45+
for _, t := range listTagResponse.Tags {
46+
tags[t.Key] = t.Value
47+
}
48+
return tags, nil
49+
}
50+
}
51+
52+
// DeleteNetworkTags deletes matching tags from a network
53+
func (c *client) DeleteNetworkTags(networkId string, tagsToDelete map[string]string) error {
54+
// https://cloudstack.apache.org/api/apidocs-4.16/apis/deleteTags.html
55+
p := c.cs.Resourcetags.NewDeleteTagsParams([]string{networkId}, resourceTypeNetwork)
56+
p.SetTags(tagsToDelete)
57+
_, err := c.cs.Resourcetags.DeleteTags(p)
58+
return err
59+
}

pkg/cloud/tags_test.go

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -19,99 +19,62 @@ package cloud_test
1919
import (
2020
infrav1 "github.com/aws/cluster-api-provider-cloudstack/api/v1beta1"
2121
"github.com/aws/cluster-api-provider-cloudstack/pkg/cloud"
22-
"github.com/golang/mock/gomock"
2322
. "github.com/onsi/ginkgo"
2423
. "github.com/onsi/gomega"
2524
)
2625

2726
var _ = Describe("Tag Unit Tests", func() {
28-
var ( // Declare shared vars.
29-
mockCtrl *gomock.Controller
30-
// mockClient *cloudstack.CloudStackClient
31-
// ags *cloudstack.MockAffinityGroupServiceIface
32-
// fakeAG *cloud.AffinityGroup
27+
var (
3328
cluster *infrav1.CloudStackCluster
34-
// machine *infrav1.CloudStackMachine
35-
// capiMachine *capiv1.Machine
36-
// client cloud.Client
3729
)
3830

3931
BeforeEach(func() {
40-
// // Setup new mock services.
41-
// mockCtrl = gomock.NewController(GinkgoT())
42-
// mockClient = cloudstack.NewMockClient(mockCtrl)
43-
// ags = mockClient.AffinityGroup.(*cloudstack.MockAffinityGroupServiceIface)
44-
// client = cloud.NewClientFromCSAPIClient(mockClient)
45-
// fakeAG = &cloud.AffinityGroup{
46-
// Name: "FakeAffinityGroup",
47-
// Type: cloud.AffinityGroupType}
4832
cluster = &infrav1.CloudStackCluster{Spec: infrav1.CloudStackClusterSpec{
4933
Zone: "Zone1", Network: "SharedGuestNet1"}}
50-
// machine = &infrav1.CloudStackMachine{Spec: infrav1.CloudStackMachineSpec{
51-
// Offering: "Medium Instance", Template: "Ubuntu20"}}
52-
// machine.ObjectMeta.SetName("rejoshed-affinity-group-test-vm")
53-
// capiMachine = &capiv1.Machine{}
5434
})
5535

56-
AfterEach(func() {
57-
mockCtrl.Finish()
58-
})
59-
60-
// It("fetches an affinity group", func() {
61-
// ags.EXPECT().GetAffinityGroupByName(fakeAG.Name).Return(&cloudstack.AffinityGroup{}, 1, nil)
62-
63-
// Ω(client.GetOrCreateAffinityGroup(cluster, fakeAG)).Should(Succeed())
64-
// })
65-
// It("creates an affinity group", func() {
66-
// fakeAG.Id = "FakeID"
67-
// cluster.Spec.Account = "FakeAccount"
68-
// cluster.Status.DomainID = "FakeDomainId"
69-
// ags.EXPECT().GetAffinityGroupByID(fakeAG.Id).Return(nil, -1, errors.New("FakeError"))
70-
// ags.EXPECT().NewCreateAffinityGroupParams(fakeAG.Name, fakeAG.Type).
71-
// Return(&cloudstack.CreateAffinityGroupParams{})
72-
// ags.EXPECT().CreateAffinityGroup(ParamMatch(And(AccountEquals("FakeAccount"), DomainIdEquals("FakeDomainId")))).
73-
// Return(&cloudstack.CreateAffinityGroupResponse{}, nil)
74-
75-
// Ω(client.GetOrCreateAffinityGroup(cluster, fakeAG)).Should(Succeed())
76-
// })
77-
7836
Context("Tag Integ Tests", func() {
7937
client, connectionErr := cloud.NewClient("../../cloud-config")
8038

81-
var ( // Declare shared vars.
82-
arbitraryTag *map[string]string
83-
networkId string
39+
const (
40+
tagKey = "TestTag"
41+
tagValue = "ArbitraryValue"
42+
)
43+
44+
var (
45+
networkId string
8446
)
8547

8648
BeforeEach(func() {
8749
if connectionErr != nil { // Only do these tests if an actual ACS instance is available via cloud-config.
8850
Skip("Could not connect to ACS instance.")
8951
}
90-
arbitraryTag = &map[string]string{"Arbitrary": "Tag"}
52+
9153
if err := client.GetOrCreateNetwork(cluster); err != nil {
9254
Skip("Could not find network.")
9355
}
56+
9457
networkId = cluster.Status.NetworkID
9558
})
9659

97-
AfterEach(func() {
98-
mockCtrl.Finish()
60+
It("Tags a network with an arbitrary tag.", func() {
61+
tags := map[string]string{tagKey: tagValue}
62+
// Delete the tag if it already exists from a prior test run, otherwise the test will fail.
63+
_ = client.DeleteNetworkTags(networkId, tags)
64+
Ω(client.TagNetwork(networkId, tags)).Should(Succeed())
9965
})
10066

101-
PIt("Tags a network with an arbitrary tag.", func() {
102-
// https://cloudstack.apache.org/api/apidocs-4.16/apis/createTags.html
103-
Ω(client.TagNetwork(networkId, *arbitraryTag)).Should(Succeed())
67+
It("Fetches said tag.", func() {
68+
tags, err := client.GetNetworkTags(networkId)
69+
Ω(err).Should(BeNil())
70+
Ω(tags[tagKey]).Should(Equal(tagValue))
10471
})
105-
PIt("Fethes said tag.", func() {
106-
// It's hard to say what exactly the best method here is. I assume there are many ways to fetch a tag.
107-
// Maybe something like GetNetworkTags, GetLBTags, etc...
108-
// https://cloudstack.apache.org/api/apidocs-4.16/apis/listTags.html
109-
// Ω(client.FetchTag(*arbitraryTag)).Should(Succeed())
110-
})
111-
PIt("Deletes said tag.", func() {
112-
// Same, need some design through around how to delete tags.
113-
// https://cloudstack.apache.org/api/apidocs-4.16/apis/deleteTags.html
114-
// Ω(client.DeleteTags(networkId, *arbitraryTag)).Should(Succeed())
72+
73+
It("Deletes said tag.", func() {
74+
Ω(client.DeleteNetworkTags(networkId, map[string]string{tagKey: tagValue})).Should(Succeed())
75+
remainingTags, err := client.GetNetworkTags(networkId)
76+
Ω(err).Should(BeNil())
77+
Ω(remainingTags[tagKey]).Should(Equal(""))
11578
})
11679
})
11780
})

0 commit comments

Comments
 (0)